Hướng dẫn python flatten multiple nested lists - python làm phẳng nhiều 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:

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ó một vài cách để làm thẳng một danh sách lồng nhau trong Python, tùy thuộc vào sự phức tạp của nó. Một danh sách chỉ chứa các danh sách, ví dụ, dễ dàng làm phẳng hơn một danh sách với các loại dữ liệu hỗn hợp.

Bạn sẽ thấy cách xử lý từng người trong số chúng trong các phần sau.

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

Phương pháp này chỉ áp dụng cho danh sách danh sách Python và nó liên quan đến việc liên kết các mục trong danh sách lồng nhau như vậy. Nó không áp dụng cho một danh sách các vòng lặp, từ điển, bộ hoặc các loại dữ liệu hỗn hợp vì bạn không thể kết hợp các loại này.

Mặc dù bạn có thể sử dụng vòng lặp for để làm phẳng danh sách danh sách, hàm sum () rất đơn giản và dễ đọc hơn vì đó là một python One-liner:for 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

Bạn có thể sử dụng Python cho vòng lặp cho cả các loại dữ liệu hỗn hợp và đồng nhất. Vì vậy, nó hoạt động cho dù một danh sách lồng nhau chỉ chứa danh sách, bộ dữ liệu, bộ, từ điển hoặc hỗn hợp của chúng:

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']

Bạn cũng có thể đạt được điều này với một danh sách hiểu biết:

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

Danh sách Python đơn giản hóa cách bạn trình bày và truy cập dữ liệu, vì nó dễ thao tác. Mặc dù bạn đã thấy cách làm phẳng danh sách Python lồng nhau, nhưng vẫn có nhiều điều chỉnh bạn có thể áp dụng cho danh sách, tùy thuộc vào mục tiêu của bạn. Ví dụ, chuyển đổi danh sách Python thành từ điển là một nhiệm vụ phổ biến khác mà Python làm cho dễ dàng.

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

Làm phẳng một danh sách các danh sách đòi hỏi phải chuyển đổi danh sách 2D thành danh sách 1D bằng cách không tổ chức mỗi mục danh sách được lưu trữ trong danh sách các danh sách - tức là, chuyển đổi [[1, 2, 3], [4, 5, 6], [7, 8, 9]] vào [1, 2, 3, 4, 5, 6, 7, 8, 9].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?

Về cơ bản giống như cách bạn sẽ làm phẳng một danh sách lồng nhau, bạn chỉ cần thực hiện thêm công việc để lặp lại dict bằng khóa/giá trị, tạo các khóa mới cho từ điển mới của bạn và tạo từ điển ở bước cuối cùng.Đối với Python> = 3.3, hãy thay đổi nhập từ các bộ sưu tập.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.