Cách làm phẳng danh sách danh sách trong Python

Tìm hiểu cách làm phẳng danh sách các danh sách trong Python. So sánh khả năng hiểu danh sách lồng nhau, itertools.chain, tổng và các phương thức đệ quy với các ví dụ về mã.

Hãy thử Giải pháp này trong Trình chỉnh sửa

Tổng quan

Khi làm việc với các phép tính ma trận, các hàng cơ sở dữ liệu hoặc cây dữ liệu được phân tích cú pháp, bạn sẽ thường xuyên gặp phải các cấu trúc lồng nhau, chẳng hạn như danh sách các danh sách: `[[1, 2], [3, 4]]`. Làm phẳng cấu trúc này có nghĩa là chuyển đổi nó thành một danh sách một chiều chứa tất cả các phần tử riêng lẻ: `[1, 2, 3, 4]`. Python cung cấp một số cách hay để đạt được điều này.

Cách phổ biến nhất và theo phong cách Pythonic để làm phẳng một danh sách các danh sách là sử dụng cách hiểu danh sách lồng nhau: `[item for sublist in ma trận for item in sublist]`. Mặc dù cú pháp ban đầu có thể trông hơi phản trực giác vì các vòng lặp được viết theo cùng thứ tự với vòng lặp `for` lồng nhau, nhưng nó được tối ưu hóa cao, nhanh chóng và không yêu cầu nhập thư viện bên ngoài.

Ngoài ra, bạn có thể sử dụng hàm `chain.from_iterable()` của mô-đun `itertools`. Đây là cách tiếp cận hiệu quả nhất về bộ nhớ vì nó trả về một trình vòng lặp tạo ra các phần tử một cách lười biếng thay vì cấp phát ngay một danh sách mới trong bộ nhớ. Đối với các danh sách lồng nhau sâu (có độ sâu tùy ý), bạn phải viết hàm tạo đệ quy để giải nén tất cả các cấp.

Đầu ra mã & thực thi

Tập lệnh này minh họa việc làm phẳng danh sách các danh sách bằng cách sử dụng tính năng hiểu danh sách, itertools.chain và giải nén đệ quy.

import itertools

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

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Đầu ra thiết bị đầu cuối
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Triển khai từng bước

  • Sử dụng tính năng hiểu danh sách lồng nhau [item for sublist in Nested_list for item in sublist] cho cấu trúc 2D phẳng.
  • Nhập itertools và gọi itertools.chain.from_iterable(nested_list) để đánh giá lười biếng, thân thiện với bộ nhớ.
  • Xác định hàm đệ quy kiểm tra isinstance(item, list) để xử lý các tập hợp lồng nhau tùy ý.

Câu hỏi thường gặp

Tôi có thể sử dụng hàm sum() để làm phẳng danh sách không?

Có, sum(matrix, []) sẽ hoạt động nhưng không được khuyến khích. Nó chạy ở độ phức tạp O(N^2) vì nó tạo ra một bản sao danh sách mới sau mỗi lần bổ sung, gây ra hiệu suất khủng khiếp cho các tập dữ liệu lớn.

Phương pháp nhanh nhất để làm phẳng danh sách các danh sách là gì?

itertools.chain.from_iterable() thường là nhanh nhất, theo sau là khả năng hiểu danh sách lồng nhau.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.