Hướng dẫn python flatten nested list - python làm phẳng danh sách lồng nhau

Nó không cần phải đệ quy. Trên thực tế, một giải pháp lặp thường nhanh hơn vì chi phí liên quan đến các cuộc gọi chức năng. Đây là phiên bản lặp lại tôi đã viết một thời gian trước:

Nội dung chính ShowShow

  • Cách làm phẳng danh sách Python
  • Cách làm phẳng danh sách danh sách lồng nhau với hàm sum ()
  • Cách sử dụng vòng lặp for để làm phẳng danh sách lồng nhau hỗn hợp
  • Thao túng danh sách trăn như bạn muốn
  • Làm thế nào để bạn làm phẳng một danh sách các danh sách?
  • Làm thế nào để bạn làm phẳng một từ điển với danh sách và từ điển lồng nhau trong Python?
  • Làm thế nào để bạn làm phẳng một danh sách trong A For Loop Python?

def flatten(items, seqtypes=(list, tuple)):
    for i, x in enumerate(items):
        while i < len(items) and isinstance(items[i], seqtypes):
            items[i:i+1] = items[i]
    return items

Không kiểm tra hiệu suất của triển khai cụ thể này, nhưng có lẽ nó không quá tuyệt vời vì tất cả các bài tập lát cắt, cuối cùng có thể di chuyển rất nhiều bộ nhớ xung quanh. Tuy nhiên, đừng cho rằng nó phải đệ quy, hoặc đơn giản hơn để viết nó theo cách đó.

Việc triển khai này có lợi thế là làm phẳng danh sách "tại chỗ" thay vì trả lại một bản sao, như các giải pháp đệ quy luôn luôn làm. Điều này có thể hữu ích khi bộ nhớ chặt chẽ. Nếu bạn muốn một bản sao phẳng, chỉ cần chuyển trong một bản sao nông của danh sách bạn muốn làm phẳng:

flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy

Ngoài ra, thuật toán này không bị giới hạn bởi giới hạn đệ quy Python vì nó không đệ quy. Tuy nhiên, tôi chắc chắn điều này sẽ không bao giờ ra mắt.

2021 Chỉnh sửa: Điều xảy ra với tôi rằng việc kiểm tra cuối danh sách có thể được xử lý tốt hơn với ____ 7/________ 8 vì nó sẽ chỉ xảy ra một lần và việc kiểm tra vòng lặp chính có thể mang lại lợi ích hiệu suất. Điều đó sẽ giống như:

def flatten(items, seqtypes=(list, tuple)):
    try:
        for i, x in enumerate(items):
            while isinstance(items[i], seqtypes):    
                items[i:i+1] = items[i]
    except IndexError:
        pass
    return items

Với một số điều chỉnh thêm để sử dụng x được trả về bởi

flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy
0 thay vì truy cập
flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy
1 rất nhiều, bạn sẽ nhận được điều này, nhanh hơn hoặc nhanh hơn đáng kể so với phiên bản gốc, tùy thuộc vào kích thước và cấu trúc của danh sách của bạn.
def flatten(items, seqtypes=(list, tuple)):
    try:
        for i, x in enumerate(items):
            while isinstance(x, seqtypes):    
                items[i:i+1] = x
                x = items[i]
    except IndexError:
        pass
    return items

Danh sách lồng nhau có thể là danh sách các danh sách hoặc chứa một số loại dữ liệu. Nếu bạn đã xây dựng một từ một số loại dữ liệu nhỏ hơn, bạn có thể muốn làm phẳng nó để làm cho các mục dễ đọc và dễ truy cập hơn.

Tìm hiểu làm thế nào để biến một danh sách lồng nhau thành một danh sách thẳng, với ba cách tiếp cận khác nhau.

Cách làm phẳng danh sách Python

Cách làm phẳng danh sách danh sách lồng nhau với hàm sum ()

Cách sử dụng vòng lặp for để làm phẳng danh sách lồng nhau hỗn hợp

Cách làm phẳng danh sách danh sách lồng nhau với hàm sum ()

Cách sử dụng vòng lặp for để làm phẳng danh sách lồng nhau hỗn hợp

Thao túng danh sách trăn như bạn muốnfor loop to flatten a list of lists, the sum() function is straightforward and more readable as it's a Python one-liner:

nestedList = [[1, 3, 4], [2, 4], [7, 9, 0]]

flatList = sum(nestedList, [])
print(flatList)

# Output: [1, 3, 4, 2, 4, 7, 9, 0]

Cách sử dụng vòng lặp for để làm phẳng danh sách lồng nhau hỗn hợp

Thao túng danh sách trăn như bạn muốn

nestedList = [[1, 3, 4], (1, 5, 6), {1, 2, 4}, {"e": 3, "o":9, "t":7}]
flatList = []

for i in nestedList:
for k in i:
flatList.append(k)

print(flatList)

# Output: [1, 3, 4, 1, 5, 6, 1, 2, 4, 'e', 'o', 't']

Làm thế nào để bạn làm phẳng một danh sách các danh sách?

flatList = [k for i in nestedList for k in i]

print(flatList)

# Output: [1, 3, 4, 1, 5, 6, 1, 2, 4, 'e', 'o', 't']

Thao túng danh sách trăn như bạn muốn

Làm thế nào để bạn làm phẳng một danh sách các danh sách?

Làm thế nào để bạn làm phẳng một danh sách các danh sách?

Làm thế nào để bạn làm phẳng một từ điển với danh sách và từ điển lồng nhau trong Python?converting a 2D list into a 1D list by un-nesting each list item stored in the list of lists - i.e., converting [[1, 2, 3], [4, 5, 6], [7, 8, 9]] into [1, 2, 3, 4, 5, 6, 7, 8, 9] .

Làm thế nào để bạn làm phẳng một từ điển với danh sách và từ điển lồng nhau trong Python?

Làm thế nào để bạn làm phẳng một danh sách trong A For Loop Python?iterating the dict by key/value, creating new keys for your new dictionary and creating the dictionary at final step. For Python >= 3.3, change the import to from collections.

Làm thế nào để bạn làm phẳng một danh sách trong A For Loop Python?

Bạn có thể làm phẳng danh sách Python bằng cách sử dụng danh sách hiểu, một vòng lặp được lồng cho vòng lặp và phương thức itertools.chain ().Sự hiểu biết danh sách là phương pháp pythonic nhất của người Viking và do đó được ưa chuộng trong hầu hết các trường hợp.Mặc dù lồng nhau cho các vòng lặp có hiệu quả, chúng tiêu thụ nhiều dòng mã hơn là một danh sách hiểu.using a list comprehension, a nested for loop, and the itertools.chain() method. The list comprehension is the most “Pythonic” method and is therefore favoured in most cases. While nested for loops are effective, they consume more lines of code than a list comprehension.using a list comprehension, a nested for loop, and the itertools. chain() method. The list comprehension is the most “Pythonic” method and is therefore favoured in most cases. While nested for loops are effective, they consume more lines of code than a list comprehension.