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ừ
9, sau đó truy cập từng yếu tố của tua.flatten[mylist] # flattens existing list newlist = flatten[mylist[:]] # makes a flattened copy
- Mỗi phần tử được lưu trữ trong
0.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
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
0.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
- 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
0.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í 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
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.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í 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
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
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.
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
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ụ].