Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách làm phẳng danh sách lồng nhau trong Python
Trong Python, việc xử lý danh sách lồng nhau thường gặp khi làm việc với dữ liệu phức tạp hoặc cấu trúc nhiều tầng. Để đơn giản hóa và tối ưu hóa thao tác, việc chuyển đổi danh sách lồng nhau thành danh sách phẳng là một kỹ thuật hữu ích. Bài viết này sẽ giới thiệu các phương pháp phổ biến để làm phẳng danh sách lồng nhau, từ những cách cơ bản như sử dụng vòng lặp cho đến các thư viện mạnh mẽ như itertools
, functools
, và numpy
, giúp bạn lựa chọn giải pháp phù hợp với nhu cầu lập trình của mình.
Cách làm phẳng danh sách lồng nhau trong Python
Một danh sách phẳng là danh sách không chứa các phần tử lồng nhau, ví dụ:
["h", "e", "l", "l", "o"] [True, 1, 2, False]
Ngược lại, danh sách lồng nhau sẽ chứa các danh sách con:
[[7], [0, 9, 3], [4, 6, 8]] [["lorem", "ipsum", "seth"], ["domat", "texeto"]]
Dưới đây là các cách làm phẳng danh sách lồng nhau trong Python. Một số cách sử dụng công cụ tích hợp sẵn, trong khi các cách khác dùng thư viện như itertools
, functools
, hoặc numpy
.
Bài viết này được đăng tại [free tuts .net]
Sử dụng vòng lặp và List Comprehension trong Python
Đây là cách đơn giản nhất để làm phẳng danh sách. Sử dụng vòng lặp for
để duyệt qua danh sách chính và các danh sách con.
Cách 1: Dùng vòng lặp lồng nhau
nested_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] flat_list = [] for sublist in nested_list: for element in sublist: flat_list.append(element) print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Cách 2: Dùng List Comprehension
flat_list = [element for sublist in nested_list for element in sublist]
Cách 3: Dùng phương thức extend()
flat_list = [] for sublist in nested_list: flat_list.extend(sublist)
Sử dụng itertools.chain(*nested_list)
trong Python
Thư viện itertools
cung cấp phương thức chain
để gộp các danh sách con lại thành danh sách phẳng.
Cách thực hiện:
import itertools nested_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] flat_list = list(itertools.chain(*nested_list)) print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Sử dụng itertools.chain.from_iterable()
trong Python
Phương thức chain.from_iterable
tương tự như chain
, nhưng không cần sử dụng dấu *
.
Cách thực hiện:
import itertools nested_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] flat_list = list(itertools.chain.from_iterable(nested_list)) print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Sử dụng functools.reduce()
trong Python
Hàm reduce()
áp dụng một hàm cụ thể (ví dụ: cộng các danh sách con) cho các phần tử trong danh sách theo cách tích lũy.
Cách thực hiện:
from functools import reduce nested_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] flat_list = reduce(lambda x, y: x + y, nested_list) print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Hoặc sử dụng operator.concat
thay cho lambda
:
import operator from functools import reduce flat_list = reduce(operator.concat, nested_list)
Sử dụng numpy.concatenate()
trong Python
Thư viện numpy
có phương thức concatenate
để gộp các danh sách con thành danh sách phẳng.
Cách thực hiện:
import numpy nested_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] flat_list = numpy.concatenate(nested_list).tolist() print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Sử dụng numpy.array(nested_list).flat
trong Python
Phương thức flat
của mảng numpy
tạo ra một iterator cho danh sách phẳng, nhưng yêu cầu các danh sách con phải có cùng độ dài.
Cách thực hiện:
import numpy nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flat_list = list(numpy.array(nested_list).flat) print(flat_list) # Kết quả: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Nếu các danh sách con có độ dài khác nhau, kết quả sẽ không như mong đợi.
Ví dụ:
nested_list = [[1, 2, 3], [4, 5], [7, 8, 9]] flat_list = list(numpy.array(nested_list).flat) print(flat_list) # Kết quả: [[1, 2, 3], [4, 5], [7, 8, 9]]
Kết bài
Trên đây là 6 cách phổ biến để làm phẳng danh sách lồng nhau trong Python. Tùy vào mục đích và yêu cầu cụ thể mà bạn có thể chọn cách phù hợp nhất, từ cách đơn giản bằng vòng lặp đến cách tối ưu hóa với thư viện như itertools
hay numpy
. Hãy thử áp dụng các cách trên để xử lý dữ liệu một cách hiệu quả hơn!