[MẸO] Python: Làm phẳng danh sách các danh sách trong một dòng
By khoanc, at: 17:33 Ngày 16 tháng 7 năm 2025
Thời gian đọc ước tính: __READING_TIME__ minutes
![[TIPS] Python: Flatten a List of Lists in One Line](/media/filer_public_thumbnails/filer_public/b6/9e/b69ec84d-bb8c-45fd-8cee-f0cdff402a5b/python-flatten-list.png__1500x900_q85_crop_subsampling-2_upscale.jpg)
![[TIPS] Python: Flatten a List of Lists in One Line](/media/filer_public_thumbnails/filer_public/b6/9e/b69ec84d-bb8c-45fd-8cee-f0cdff402a5b/python-flatten-list.png__400x240_q85_crop_subsampling-2_upscale.jpg)
Khi làm việc với Python, bạn thường gặp phải tình huống phổ biến này:
Bạn có một danh sách các danh sách, và bạn muốn làm phẳng nó thành một danh sách đơn.
Vấn đề
Đây là một ví dụ:
data = [[1, 2], [3, 4], [5, 6]]
Kết quả mong muốn:
[1, 2, 3, 4, 5, 6]
Giải pháp đơn giản: List Comprehension
Cách Pythonic nhất để làm phẳng một danh sách các danh sách là:
flattened = [item for sublist in data for item in sublist]
Giải thích
Đây là một biểu thức list lồng nhau, tương đương về chức năng với:
flattened = []
for sublist in data:
for item in sublist:
flattened.append(item)
Nhưng ở dạng ngắn gọn hơn nhiều.
Cách khác: Sử dụng itertools.chain
Đối với các tập dữ liệu lớn hơn hoặc nhạy cảm với bộ nhớ, bạn có thể sử dụng mô-đun itertools tích hợp sẵn của Python:
import itertools
flattened = list(itertools.chain.from_iterable(data))
Phương pháp này tạo ra một iterator, có thể hiệu quả hơn khi làm việc với lượng dữ liệu lớn.
Ví dụ
data = [['a', 'b'], ['c', 'd'], ['e']]
flattened = [item for sublist in data for item in sublist]
print(flattened)
# Kết quả: ['a', 'b', 'c', 'd', 'e']
Thực hành tốt nhất
-
Sử dụng list comprehension để có mã rõ ràng và ngắn gọn khi làm việc với các tập dữ liệu nhỏ đến trung bình.
-
Sử dụng itertools.chain khi làm việc với dữ liệu lớn hoặc khi bạn muốn xử lý các mục một cách lười biếng.
Kỹ thuật này là một phần không thể thiếu trong phát triển Python sạch và được sử dụng rộng rãi trong thao tác dữ liệu, thu thập dữ liệu web và đường ống dữ liệu.
Tham khảo: Câu trả lời hàng đầu của StackOverflow