Hướng dẫn how do you flatten a tuple in python? - làm thế nào để bạn làm phẳng một tuple trong python?

Tôi có yếu tố sau của một danh sách và danh sách dài 100 yếu tố.

[(50, (2.7387451803816479e-13, 219))]

Làm cách nào để chuyển đổi từng yếu tố để trông như thế này?

[(50, 2.7387451803816479e-13, 219)]

Hỏi ngày 29 tháng 8 năm 2013 lúc 0:36Aug 29, 2013 at 0:36

Hướng dẫn how do you flatten a tuple in python? - làm thế nào để bạn làm phẳng một tuple trong python?

1

[(a, b, c) for a, (b, c) in l]

Đóng gói và giải nén giải quyết vấn đề.

Bonifacio2

3.1285 Huy hiệu vàng35 Huy hiệu bạc51 Huy hiệu Đồng5 gold badges35 silver badges51 bronze badges

Đã trả lời ngày 29 tháng 8 năm 2013 lúc 0:40Aug 29, 2013 at 0:40

user2357112user2357112user2357112

245K26 Huy hiệu vàng399 Huy hiệu bạc478 Huy hiệu đồng26 gold badges399 silver badges478 bronze badges

3

Mới trong Python 3.5 Với phần mở bổ sung được giới thiệu trong PEP 448, bạn có thể sử dụng các biểu thức được đặt chính phủ trong các chữ viết mà bạn có thể sử dụng

>>> l = [(50, (2.7387451803816479e-13, 219)), (40, (3.4587451803816479e-13, 220))]
>>> [(a, *rest) for a, rest in l]
[(50, 2.738745180381648e-13, 219), (40, 3.458745180381648e-13, 220)]

Điều này có thể hữu ích nếu bạn có một tuple lồng nhau được sử dụng để lưu giữ hồ sơ với nhiều yếu tố mà bạn muốn làm phẳng.

Đã trả lời ngày 6 tháng 6 năm 2016 lúc 7:39Jun 6, 2016 at 7:39

Hướng dẫn how do you flatten a tuple in python? - làm thế nào để bạn làm phẳng một tuple trong python?

Miradulomiradulomiradulo

Phù bằng vàng 27,9K678 Huy hiệu bạc93 Huy hiệu đồng6 gold badges78 silver badges93 bronze badges

Bạn có thể sử dụng chức năng sau và áp dụng nó trong một vòng lặp cho mọi yếu tố trong danh sách.

def flatten(data):
    if isinstance(data, tuple):
        if len(data) == 0:
            return ()
        else:
            return flatten(data[0]) + flatten(data[1:])
    else:
        return (data,)

Làm thế nào nó hoạt động:

  • Đầu tiên nó sẽ được kiểm tra nếu loại là tuple, nếu không, nó "tổng" đối số
  • Dòng thứ hai trả về một tuple trống, nếu tuple trống
  • Dòng thứ ba thoát khỏi phần tử đầu tiên và gọi hàm đã đệ quy

Điều tốt đẹp trong giải pháp này là:

  • Không cần thiết phải biết cấu trúc của tuple đã cho
  • Tuple có thể được lồng sâu tùy tiện
  • Hoạt động trong Python 2.2+ (và có thể sớm hơn)

Mã này được điều chỉnh một chút so với nguồn sau: https://mail.python.org/pipermail/tutor/2001-april/005025.html
https://mail.python.org/pipermail/tutor/2001-April/005025.html

Hy vọng nó sẽ giúp ai đó :)

Hướng dẫn how do you flatten a tuple in python? - làm thế nào để bạn làm phẳng một tuple trong python?

Jim Pivarski

5.2471 Huy hiệu vàng34 Huy hiệu bạc45 Huy hiệu đồng1 gold badge34 silver badges45 bronze badges

Đã trả lời ngày 8 tháng 11 năm 2017 lúc 12:32Nov 8, 2017 at 12:32

SagacitySagacitysagacity

3313 Huy hiệu bạc7 Huy hiệu Đồng3 silver badges7 bronze badges

Một cải tiến từ câu trả lời của @Sagacity, điều này sẽ chạy lại một trình tạo làm phẳng

[(50, 2.7387451803816479e-13, 219)]
0 bằng cách sử dụng
[(50, 2.7387451803816479e-13, 219)]
1 và
[(50, 2.7387451803816479e-13, 219)]
2.

def flatten(data):
    if isinstance(data, tuple):
        for x in data:
            yield from flatten(x)
    else:
        yield data

Để biến nó thành

[(50, 2.7387451803816479e-13, 219)]
3 hoặc
[(50, 2.7387451803816479e-13, 219)]
0, hãy sử dụng
[(50, 2.7387451803816479e-13, 219)]
5 hoặc
[(50, 2.7387451803816479e-13, 219)]
6.

list(flatten(nested_tuple))
tuple(flatten(nested_tuple))

Nếu nó cần phải hoạt động trong Python 2, hãy thay thế

[(50, 2.7387451803816479e-13, 219)]
7 bằng một vòng lặp khác:

def flatten(data):
    if isinstance(data, tuple):
        for x in data:
            for y in flatten(x):
                yield y
    else:
        yield data

Đã trả lời ngày 21 tháng 11 năm 2020 lúc 0:39Nov 21, 2020 at 0:39

Bạn có thể nhận được kết quả theo cách này

>> example =  [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example] 
[(50, 2.738745180381648e-13, 219)]

Đã trả lời ngày 16 tháng 3 năm 2017 lúc 12:14Mar 16, 2017 at 12:14

Một cách tương thích Python 2.7 để làm những gì Mitch gợi ý cho Python 3.5.

>>> example =  [(50, (2.7387451803816479e-13, 219)),
            (100, (3.7387451803816479e-13, 218))]
>>> [(lambda *x: x)(k, *r) for k, r in example]
[(50, 2.738745180381648e-13, 219), (100, 3.7387451803816477e-13, 218)]

Ưu điểm của phương pháp này là bạn không phải tìm một tên biến cho từng giá trị của bộ tuple bên trong để làm phẳng như trong câu trả lời được chấp nhận. Nếu có hai hoặc ba mục, đó không thực sự là một vấn đề, nhưng hãy tưởng tượng có các giá trị thứ mười hoặc nhiều hơn ...

Đã trả lời ngày 29 tháng 6 năm 2017 lúc 9:40Jun 29, 2017 at 9:40

Krisskrisskriss

Phim thương hiệu vàng 23K1717 gold badges97 silver badges115 bronze badges