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ã.
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))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ìm hiểu cách sử dụng tính năng hiểu danh sách trong Python. Viết các vòng lặp ngắn gọn, áp dụng các bộ lọc có điều kiện và xây dựng ma trận bằng cú pháp trực quan rõ ràng.
Cách cắt danh sách trong PythonTìm hiểu cách cắt danh sách trong Python bằng cú pháp dấu ngoặc mạnh mẽ. Làm chủ các đối số bắt đầu, dừng và bước, lập chỉ mục phủ định và đảo ngược danh sách.
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.
Giải thích về biến và kiểu dữ liệu trong Python
Hiểu các biến Python và các kiểu dữ liệu cốt lõi (chuỗi, số nguyên, số float, boolean). Hướng dẫn đầy đủ cho người mới bắt đầu về gán bộ nhớ trong Python.
Bảng cheat các phương thức danh sách Python
Hướng dẫn tham khảo nhanh về các thao tác với danh sách Python. Nắm vững cách thêm, chèn, xóa, sắp xếp và cắt các phần tử.
Python vs JavaScript: Ngôn ngữ lập trình nào tốt nhất?
So sánh toàn diện giữa Python và JavaScript. Khám phá sự khác biệt về cú pháp, hiệu suất, trường hợp sử dụng (phụ trợ so với giao diện người dùng) và các ví dụ về mã hóa.