Làm thế nào để bạn mở ra một danh sách trong python?

Bài viết này mô tả cách làm phẳng một danh sách các danh sách (danh sách lồng nhau) trong Python. Bạn có thể sử dụng

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7,
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8 và cách hiểu danh sách

  • Làm phẳng một danh sách các danh sách (danh sách 2D)
    • Làm phẳng danh sách với
      t_2d = ((0, 1), (2, 3))
      
      print(tuple(itertools.chain.from_iterable(t_2d)))
      # (0, 1, 2, 3)
      
      7
    • Làm phẳng danh sách với
      t_2d = ((0, 1), (2, 3))
      
      print(tuple(itertools.chain.from_iterable(t_2d)))
      # (0, 1, 2, 3)
      
      8
    • Làm phẳng danh sách với khả năng hiểu danh sách
    • So sánh tốc độ
  • Làm phẳng danh sách 3D và nhiều chiều hơn và danh sách không đều

Sử dụng

l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
1 hoặc
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
2 để làm phẳng một mảng NumPy
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
3

  • Làm phẳng một mảng NumPy với ravel() và flatten()

Ngược lại, hãy xem bài viết sau về cách chuyển đổi

l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
3 hoặc
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
5 một chiều thành hai chiều

  • Chuyển đổi mảng 1D thành mảng 2D trong Python (numpy. ndarray, danh sách)

Liên kết được tài trợ

Làm phẳng một danh sách các danh sách (danh sách 2D)

Làm phẳng danh sách với t_2d = ((0, 1), (2, 3)) print(tuple(itertools.chain.from_iterable(t_2d))) # (0, 1, 2, 3) 7

Bạn có thể làm phẳng một danh sách các danh sách với

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7

  • itertools. chuỗi. from_iterable() — Các hàm tạo trình vòng lặp để lặp hiệu quả — Python 3. 8. 4 tài liệu

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
1

nguồn. list_flatten. py

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7 trả về một iterator, vì vậy nếu bạn muốn chuyển đổi nó thành một danh sách, hãy sử dụng
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
9. Không cần thiết phải lập danh sách khi sử dụng nó trong câu lệnh
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
40

Một bộ của các bộ có thể được xử lý theo cùng một cách. Trong ví dụ sau, kết quả được chuyển đổi thành một bộ với

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
41. Nếu bạn cần một danh sách, hãy sử dụng
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
9

  • Chuyển đổi danh sách và tuple với nhau trong Python

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)

nguồn. list_flatten. py

Chỉ danh sách 2D mới có thể được làm phẳng bằng

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7. Trong trường hợp danh sách 3D trở lên, kết quả như sau

l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]

nguồn. list_flatten. py

Một lỗi được đưa ra nếu nó chứa các đối tượng không thể lặp lại, chẳng hạn như

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
44 hoặc
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
45

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
4

nguồn. list_flatten. py

Các trường hợp có danh sách 3D trở lên và danh sách không đều được mô tả sau

Làm phẳng danh sách với t_2d = ((0, 1), (2, 3)) print(tuple(itertools.chain.from_iterable(t_2d))) # (0, 1, 2, 3) 8

Bạn cũng có thể làm phẳng một danh sách các danh sách bằng chức năng tích hợp sẵn

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8

Giá trị ban đầu có thể được chỉ định làm đối số thứ hai của

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8. Nếu bạn vượt qua danh sách trống
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
49, hoạt động
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
70 của danh sách sẽ nối các danh sách

  • Thêm một mục vào danh sách trong Python (chắp thêm, mở rộng, chèn)

Lưu ý rằng giá trị mặc định của đối số thứ hai là

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
71, vì vậy nếu bỏ qua, sẽ xảy ra lỗi do hoạt động của
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
70 với
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
44 và
l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
5

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7

nguồn. list_flatten. py

Tuples có thể được xử lý trong cùng một cách

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
3

nguồn. list_flatten. py

Giống như

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7, nó không hoạt động cho hơn 3D hoặc danh sách không đều

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
5

nguồn. list_flatten. py

Làm phẳng danh sách với khả năng hiểu danh sách

Bạn cũng có thể làm phẳng một danh sách các danh sách với khả năng hiểu danh sách lồng nhau

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
6

nguồn. danh_sách. py

Ví dụ trên tương đương với vòng lặp

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
40 lồng nhau sau

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8

nguồn. danh_sách. py

Trong trường hợp hiểu danh sách ở trên, cũng như các phương pháp khác, chỉ có thể làm phẳng một cấp độ và sẽ xảy ra lỗi nếu bao gồm các đối tượng không thể lặp lại

Cũng có thể làm cho lồng sâu hơn để hỗ trợ nhiều hơn ba chiều hoặc tạo phân nhánh có điều kiện tùy thuộc vào loại phần tử, nhưng điều này không được khuyến khích vì nó sẽ quá phức tạp

Xem bài viết sau để biết thêm thông tin về hiểu danh sách

  • Danh sách hiểu trong Python

So sánh tốc độ

Lưu ý rằng mặc dù

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8 dễ sử dụng nhưng nó chậm hơn nhiều so với
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7 hoặc khả năng hiểu danh sách khi số lượng dòng (số lượng danh sách bên trong) lớn. Tốt hơn là không sử dụng
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
8 khi số lượng dòng lớn và tốc độ xử lý và hiệu quả bộ nhớ là quan trọng

Mặc dù bạn phải nhập itertools, nhưng

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
7 nhanh hơn khả năng hiểu danh sách

Đoạn mã sau được đo bằng lệnh ma thuật

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
31 trên Jupyter Notebook. Lưu ý rằng nó không hoạt động trên tập lệnh Python

  • Đo thời gian thực hiện với timeit trong Python

5 dòng

l_3d = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]

print(list(itertools.chain.from_iterable(l_3d)))
# [[0, 1], [2, 3], [4, 5], [6, 7]]
4

nguồn. list_flatten_timeit. py

100 dòng

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
0

nguồn. list_flatten_timeit. py

10000 dòng

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
1

nguồn. list_flatten_timeit. py

Làm phẳng danh sách 3D và nhiều chiều hơn và danh sách không đều

Cần xác định một chức năng mới để làm phẳng danh sách 3D và đa chiều hơn hoặc danh sách không đều

Mã mẫu sau dựa trên bài viết sau

  • python - Làm phẳng danh sách danh sách không đều

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
2

nguồn. list_flatten. py

Loại phần tử

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
32 được kiểm tra bởi
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
33 và được xử lý đệ quy

  • Nhận và kiểm tra loại đối tượng trong Python. loại (), isinstance ()

Xác định xem

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
32 có thể lặp lại bằng
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
35 không. Bạn cần nhập thư viện chuẩn
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
36

  • bộ sưu tập. abc. Có thể lặp lại — Các lớp cơ sở trừu tượng dành cho vùng chứa — Python 3. 8. 4 tài liệu

Chuỗi

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
37 và chuỗi byte
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
38 cũng có thể lặp lại, vì vậy chúng bị loại trừ. Nếu không loại trừ sẽ tách ra từng ký tự

Chức năng này có thể được sử dụng trong mọi trường hợp

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
3

nguồn. list_flatten. py

Sẽ không thành vấn đề nếu các đối tượng có thể lặp lại khác nhau như danh sách, bộ dữ liệu và

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
39 được bao gồm

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
4

nguồn. list_flatten. py

Nếu bạn chỉ muốn xử lý danh sách, bạn không cần nhập

t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
36. Tuples và
t_2d = ((0, 1), (2, 3))

print(tuple(itertools.chain.from_iterable(t_2d)))
# (0, 1, 2, 3)
39 không được làm phẳng, nhưng điều này sẽ đủ trong hầu hết các trường hợp