Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Làm phẳng List (Flatten List) trong Python: Hướng dẫn thực hành

Làm phẳng List (Flatten List) trong Python: Hướng dẫn thực hành

Làm phẳng list (flattening) là quá trình loại bỏ một chiều từ list. Chiều (dimension) là toạ độ bổ sung cần để định vị mục trong list. Bạn có thể làm phẳng list Python dùng list comprehension, vòng lặp for lồng nhau, hoặc phương thức itertools.chain().

List Python có thể chứa nhiều chiều. Nghĩa là bạn có list trong list. Các list này, đôi khi gọi là "nested lists" (list lồng nhau), có thể chuyển đổi lại thành list thông thường.

Điều này nghĩa là bạn có thể di chuyển tất cả giá trị từ list trong list vào một list đơn. Chuyển list của list thành list đơn gọi là "làm phẳng list".

Làm phẳng List Python

Có ba cách làm phẳng list Python:

  • Dùng list comprehension.
  • Dùng vòng lặp for lồng nhau.
  • Dùng phương thức itertools.chain().

Trong hướng dẫn này, ta nói về cách làm phẳng list dùng list comprehension, vòng lặp for, và phương thức itertools.chain(). Ta đi qua hai ví dụ để bạn bắt đầu làm phẳng list trong chương trình của mình.

Python: Làm phẳng List dùng List Comprehension

List comprehension Python định nghĩa list dựa trên nội dung list hiện có. Bạn có thể tùy chỉnh mỗi phần tử vào list mới bằng cách chỉ định điều kiện hoặc thay đổi trong comprehension.

Comprehensions là syntactic sugar (cú pháp đường) cho việc dùng vòng lặp for lặp qua list và tạo list mới. Nghĩa là chúng hoạt động theo cách cơ bản giống vòng lặp for nhưng dùng cú pháp khác.

Cú pháp list comprehension:

numbers = [1, 2, 3]
new_numbers = [number * 2 for number in numbers]

Comprehension này nhân mỗi số trong list "numbers" với 2.

Ví dụ làm phẳng List: List Comprehension

Ta có list của list chứa các nhân bánh mì kẹp khác nhau tại nhà hàng. Hiện tại list của list trông như sau:

foods = [
    ["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
    ["Cheese", "Egg"],
    ["Ham", "Bacon", "Chicken Club", "Tuna"]
]

List đầu chứa nhân chay (vegan); list hai chứa nhân lacto-vegetarian; list ba chứa tất cả nhân có thịt.

Ta muốn đổi list này thành một list đơn các món ăn. Dễ làm việc với list một chiều hơn là hai. Không cần nhiều hơn một chiều trong list này. Để loại bỏ chiều thứ hai, ta dùng list comprehension:

new_foods = [food for sublist in foods for food in sublist]
print(new_foods)

List comprehension này lặp qua mọi list trong biến foods Python. Mỗi giá trị sau đó được thêm vào list chính. Khi list được tạo, ta in ra màn hình.

Chạy mã xem kết quả:

['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']

List của list đã được chuyển thành list phẳng thành công. Tất cả nguyên liệu giờ xuất hiện trong một list thay vì ba.

Python: Làm phẳng List dùng vòng lặp For lồng nhau

Ta cũng đạt kết quả tương tự dùng vòng lặp for lồng nhau Python. "Vòng lặp for lồng nhau" là cách khác nói "vòng lặp for trong vòng lặp for". List comprehension là cách khác biểu diễn vòng lặp for sau:

new_foods = []
for sublist in foods:
    for food in sublist:
        new_foods.append(food)
print(new_foods)

Mã dùng hai vòng lặp for lặp qua mỗi mục list trong mỗi list trong list của list gốc. Chạy mã:

['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']

Chương trình trả về cùng kết quả với list comprehension. Trong hầu hết trường hợp, list comprehension là giải pháp tốt hơn vòng lặp for. List comprehension ngắn gọn hơn và, trong trường hợp này, dễ đọc hơn vòng lặp for lồng nhau.

Python: Làm phẳng List dùng Itertools

Itertools là module trong thư viện chuẩn Python. Module cung cấp nhiều phương thức, giúp dễ dàng làm việc với đối tượng iterable và generator.

Với mục đích của ta, ta chỉ đề cập phương thức chain(). Phương thức này chấp nhận list của list và trả về list phẳng.

Bắt đầu bằng import module itertools vào mã dùng câu lệnh import Python:

import itertools

Tiếp theo, định nghĩa list của list và dùng chain() làm phẳng list:

foods = [
    ["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
    ["Cheese", "Egg"],
    ["Ham", "Bacon", "Chicken Club", "Tuna"]
]
new_foods = itertools.chain(*foods)

Trong mã, ta dùng ký hiệu * để unpack list. Điều này chuyển list thành đối số hàm có thể phân tích bởi chain().

Phương thức chain() trả về đối tượng itertools.chain. Để thấy list phẳng, ta phải chuyển đối tượng này thành list. Ta làm bằng phương thức list():

print(list(new_foods))

Thực thi mã:

['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']

Mã đã làm phẳng list.

Mặc dù itertools hiệu quả làm phẳng list, nhưng nó phức tạp hơn hai cách trước.

Điều này vì bạn phải import itertools vào mã, đưa vào dependency mới. Thêm nữa, phương thức chain() liên quan đến unpacking có thể khó hiểu cho người mới. 

Kết luận

Bạn có thể làm phẳng list Python dùng list comprehension, vòng lặp for lồng nhau, và itertools.chain(). List comprehension là phương pháp "Pythonic" nhất và do đó được ưu tiên trong hầu hết trường hợp.

Mặc dù vòng lặp for lồng nhau hiệu quả, chúng tiêu tốn nhiều dòng mã hơn list comprehension. Phương thức itertools.chain() tương tự hiệu quả nhưng khó hiểu cho người mới.

Thường không cần import thư viện mới — itertools — khi Python đã cho bạn tất cả công cụ cần thiết để làm phẳng list.

Bạn muốn tìm hiểu thêm về Python? Xem hướng dẫn hoàn chỉnh "Cách học Python" của chúng tôi. Bạn sẽ tìm thấy mẹo học tập chuyên gia và danh sách khóa học, sách hàng đầu để học.