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.