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).flattrong 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!

            Các kiểu dữ liệu trong C ( int - float - double - char ...)        
            Thuật toán tìm ước chung lớn nhất trong C/C++        
            Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)        
            ComboBox - ListBox trong lập trình C# winforms        
            Random trong Python: Tạo số random ngẫu nhiên        
            Lệnh cin và cout trong C++        
                Cách khai báo biến trong PHP, các loại biến thường gặp            
                Download và cài đặt Vertrigo Server            
                Thẻ li trong HTML            
                Thẻ article trong HTML5            
                Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên            
                Cách dùng thẻ img trong HTML và các thuộc tính của img            
                Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng