Hướng dẫn how do you flatten multiple nested lists in python? - làm cách nào để làm phẳng nhiều danh sách lồng nhau trong python?

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: Tôi xảy ra rằng việc kiểm tra cuối danh sách có thể được xử lý tốt hơn với ____ 14/________ 15 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

flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy
6 được trả về bởi
flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy
7 thay vì truy cập
flatten(mylist)                # flattens existing list
newlist = flatten(mylist[:])   # makes a flattened copy
8 rất nhiều, bạn có đượ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

Trong ví dụ này, bạn sẽ học cách lập một danh sách dẹt từ một danh sách lồng nhau trong Python.

Để hiểu ví dụ này, bạn nên có kiến ​​thức về các chủ đề lập trình Python sau:

  • Python cho vòng lặp
  • Danh sách Python

Ví dụ 1: Sử dụng danh sách hiểu

my_list = [[1], [2, 3], [4, 5, 6, 7]]

flat_list = [num for sublist in my_list for num in sublist]
print(flat_list)

Đầu ra

[1, 2, 3, 4, 5, 6, 7]

Đây là một trong những cách pythonic đơn giản nhất để làm phẳng danh sách.

  • Sử dụng danh sách hiểu truy cập vào trình phụ từ
    flatten(mylist)                # flattens existing list
    newlist = flatten(mylist[:])   # makes a flattened copy
    
    9, sau đó truy cập từng yếu tố của tua.
  • Mỗi phần tử được lưu trữ trong
    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
    
    0.

Tìm hiểu thêm về danh sách hiểu tại Python Danh sách hiểu.


Ví dụ 2: Sử dụng lồng nhau cho các vòng (cách không pythonic)

my_list = [[1], [2, 3], [4, 5, 6, 7]]

flat_list = []
for sublist in my_list:
    for num in sublist:
        flat_list.append(num)

print(flat_list)

Đầu ra

[1, 2, 3, 4, 5, 6, 7]
  • Tạo một danh sách trống
    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
    
    0.
  • Truy cập từng phần tử của trình phụ bằng cách sử dụng vòng lặp lồng nhau và nối phần tử đó vào
    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
    
    0.

Ví dụ 3: Sử dụng gói itertools

import itertools

my_list = [[1], [2, 3], [4, 5, 6, 7]]

flat_list = list(itertools.chain(*my_list))
print(flat_list)

Đầu ra

[1, 2, 3, 4, 5, 6, 7]

Sử dụng mô -đun Itertools, chúng ta có thể tạo một danh sách phẳng.

  • Phương thức
    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
    
    3 từ mô -đun ITERTOOLS trả về từng phần tử của từng phần tử (nghĩa là danh sách phụ).
  • 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
    
    4 chuyển đổi các giá trị được trả về thành một danh sách.

Ví dụ 4: Sử dụng Sum ()

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

Đầu ra

[1, 2, 3, 4, 5, 6, 7]
  • Sử dụng mô -đun Itertools, chúng ta có thể tạo một danh sách phẳng.
  • Phương thức
    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
    
    3 từ mô -đun ITERTOOLS trả về từng phần tử của từng phần tử (nghĩa là danh sách phụ).

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 4 chuyển đổi các giá trị được trả về thành một danh sách.

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

Đầu ra

[1, 2, 3, 4, 5, 6, 7]

Sử dụng mô -đun Itertools, chúng ta có thể tạo một danh sách phẳng.

Phương thức

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
3 từ mô -đun ITERTOOLS trả về từng phần tử của từng phần tử (nghĩa là danh sách phụ).

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

Để làm phẳng một danh sách lồng nhau, chúng ta có thể sử dụng vòng lặp hoặc vòng lặp trong khi lặp hoặc đệ quy hoặc phương thức DeepFlatten ().Các kỹ thuật khác bao gồm nhập nhiều thư viện Python bên ngoài và sử dụng các chức năng tích hợp của chúng.use the for loop or the While loop or recursion or the deepflatten() Method. Other techniques include importing numerous external Python libraries and using their built-in functions.

Làm thế nào để bạn làm phẳng một danh sách lồng nhau bằng cách sử dụng đệ quy trong Python?

Cách tiếp cận từng bước: Trong hàm đệ quy đó, nếu chúng ta thấy danh sách trống thì chúng ta sẽ trả về danh sách.Khác, chúng tôi gọi hàm ở dạng đệ quy cùng với những người phụ của nó làm tham số cho đến khi danh sách được làm phẳng.Sau đó, cuối cùng, chúng tôi sẽ in danh sách phẳng làm đầu ra.In that recursive function, if we find the list as empty then we return the list. Else, we call the function in recursive form along with its sublists as parameters until the list gets flattened. Then finally, we will print the flattened list as output.

Làm cách nào để làm phẳng 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] .