Làm phẳng danh sách 3d python

Danh sách là cấu trúc dữ liệu linh hoạt nhất trong Python. Trong khi đó, danh sách 2D thường được gọi là danh sách danh sách, là một đối tượng danh sách trong đó mọi mục đều là danh sách - ví dụ:.

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
3

Làm phẳng 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 bỏ lồng từng mục danh sách được lưu trữ trong danh sách danh sách - i. e. , chuyển đổi

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
4 thành
regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
5

Quá trình làm phẳng có thể được thực hiện bằng cách sử dụng các vòng lặp lồng nhau, hiểu danh sách, đệ quy, các hàm tích hợp hoặc bằng cách nhập các thư viện trong Python tùy thuộc vào mức độ đều đặn và độ sâu của các danh sách lồng nhau

Các loại danh sách lồng nhau

Vì Python được gõ yếu, bạn có thể gặp các danh sách danh sách thường xuyên và không thường xuyên

Danh sách danh sách thông thường

Mỗi phần tử của danh sách này là một danh sách con, do đó tuân thủ tính đồng nhất của loại phần tử
Thí dụ.

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
4 là danh sách thông thường của danh sách vì
regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
7 thuộc loại
regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
8

Danh sách danh sách bất thường

Mọi phần tử của danh sách này đều là danh sách con hoặc mục không thuộc danh sách (ví dụ: số nguyên hoặc chuỗi). Do đó, có sự bất thường về loại phần tử. Thí dụ.

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
9 trong đó
Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
0 và
Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
1 thuộc loại
regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
8 và
Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
3 thuộc loại
Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
4

Làm phẳng danh sách các danh sách bằng cách sử dụng Nested for Loops

Đây là cách tiếp cận mạnh mẽ để có được danh sách phẳng bằng cách chọn mọi phần tử từ danh sách danh sách và đặt nó vào danh sách 1D

Mã trực quan như được hiển thị bên dưới và hoạt động cho cả danh sách danh sách thông thường và không thường xuyên

Kết quả này trong

Original List [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
Transformed Flat List [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Làm phẳng danh sách các danh sách bằng cách hiểu danh sách

Cách tiếp cận này cung cấp một giải pháp tao nhã nhưng ít trực quan hơn để tạo danh sách phẳng dựa trên danh sách 2D hiện có

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)

Cái nào sẽ xuất ra như sau

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]

Làm phẳng danh sách các danh sách theo cách đệ quy

Danh sách 2D cũng có thể được làm phẳng theo cách đệ quy. Việc thực hiện dưới đây hoạt động cho cả danh sách danh sách thường xuyên và không thường xuyên

def flatten(list_of_lists):
    if len(list_of_lists) == 0:
        return list_of_lists
    if isinstance(list_of_lists[0], list):
        return flatten(list_of_lists[0]) + flatten(list_of_lists[1:])
    return list_of_lists[:1] + flatten(list_of_lists[1:])


print(flatten([[1, 2, 3, 4], [5, 6, 7], [8, 9], 10]))

Cái nào sẽ cho chúng ta

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Sử dụng thư viện

Bạn cũng có thể nhờ đến sự trợ giúp của các thư viện Python cho nhiệm vụ này

Làm phẳng danh sách các danh sách bằng cách sử dụng funcools (reduce() và iconcat())

Hàm

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
5 thực hiện thao tác nối cơ bản và được áp dụng tích lũy cho các mục của danh sách danh sách, từ trái sang phải, để giảm nó thành một danh sách duy nhất

Điều gì sẽ cho chúng ta kết quả mong muốn

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10], 11]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

Làm phẳng danh sách các danh sách bằng itertools (chain())

Cách tiếp cận này là lý tưởng để chuyển đổi danh sách 2-D thành một danh sách phẳng vì nó coi các chuỗi liên tiếp là một chuỗi duy nhất bằng cách lặp qua lần lặp được truyền dưới dạng đối số theo cách tuần tự

import itertools

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
flat_list = list(itertools.chain(*regular_list))

print('Original list', regular_list)
print('Transformed list', flat_list)

Một lần nữa, điều này sẽ cho chúng ta một danh sách phẳng làm đầu ra

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Làm phẳng danh sách các danh sách bằng cách sử dụng numpy (nối () và phẳng ())

Numpy cung cấp các hoạt động phổ biến bao gồm nối các mảng 2D thông thường theo hàng hoặc theo cột. Chúng tôi cũng đang sử dụng thuộc tính

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
6 để nhận trình vòng lặp 1D trên mảng nhằm đạt được mục tiêu của mình. Tuy nhiên cách này tương đối chậm

import numpy

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]

flat_list = list(numpy.concatenate(regular_list).flat)

print('Original list', regular_list)
print('Transformed list', flat_list)

Cung cấp cho chúng tôi đầu ra mong muốn

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]

Sử dụng chức năng tích hợp

Nhiệm vụ làm phẳng cũng có thể được thực hiện bằng cách sử dụng các hàm tích hợp sẵn mà Python cung cấp

Làm phẳng danh sách các danh sách bằng cách sử dụng tổng

Tổng hợp các danh sách bên trong là một giải pháp khác. Hàm có hai tham số.

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
7 là một danh sách gồm các danh sách và
Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
8 là một danh sách trống trong trường hợp của chúng tôi, đóng vai trò là danh sách cố định ban đầu mà các mục của danh sách con bên trong được thêm vào

Cách tiếp cận này thuận tiện vì bạn không phải nhập bất kỳ thứ gì nhưng chậm hơn so với các hàm

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]
9 và hàm
def flatten(list_of_lists):
    if len(list_of_lists) == 0:
        return list_of_lists
    if isinstance(list_of_lists[0], list):
        return flatten(list_of_lists[0]) + flatten(list_of_lists[1:])
    return list_of_lists[:1] + flatten(list_of_lists[1:])


print(flatten([[1, 2, 3, 4], [5, 6, 7], [8, 9], 10]))
0 khi số lượng danh sách con lớn

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
0

Với đầu ra

Original list [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
Transformed list [1, 2, 3, 4, 5, 6, 7, 8, 9]

Làm phẳng danh sách các danh sách bằng Lambda

Một chức năng ẩn danh có thể được xác định bằng từ khóa lambda. Danh sách thông thường/không thường xuyên được chuyển làm đối số cho hàm ẩn danh này và việc đánh giá biểu thức được thực hiện để có được danh sách 1D phẳng

Chúng tôi một lần nữa sẽ nhận được kết quả mong muốn

regular_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
flat_list = [item for sublist in regular_list for item in sublist]
print('Original list', regular_list)
print('Transformed list', flat_list)
2

Phần kết luận

Trong bài viết này, chúng tôi đã cung cấp một danh sách đầy đủ các cách chúng tôi có thể hoàn thành nhiệm vụ làm phẳng danh sách các danh sách trong Python