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

Chuyển đổi cột thành các phần tử riêng biệt trong list lồng nhau Python

Trong phân tích hoặc xử lý dữ liệu bằng Python, chúng ta gặp tình huống list cho trước cần được mô hình lại hoặcreshape để có các list với các cột khác nhau. Chúng ta có thể đạt được điều đó với nhiều cách tiếp cận như thảo luận dưới đây.

Sử dụng cắt chuỗi (Slicing)

Chúng ta có thể cắt list tại các phần tử nhất định để tạo cấu trúc cột. Ở đây, chuyển đổi list cho trước thành list mới nơi các phần tử được tách từ giữa. Sử dụng hai vòng lặp for. Vòng ngoài tách phần tử từ phần tử 0 đến phần tử 2, vòng trong từ phần tử 2 đến cuối.

Ví dụ

x = [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]
# Sử dụng list slicing và list comprehension
print("Đầu vào cho trước là : \n" + str(x))
result = [m for y in [[n[2:], [n[0:2]]] for n in x] for m in y]
print("Chuyển đổi cột thành các phần tử riêng biệt trong list lồng nhau : \n" + str(result))

Kết quả

Chạy đoạn code trên cho kết quả sau:

Đầu vào cho trước là : [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]
Chuyển đổi cột thành các phần tử riêng biệt trong list lồng nhau : [[15, 20], [[5, 10]], [35, 40], [[25, 30]], [55, 60], [[45, 50]]]

Sử dụng itertools.chain() và list comprehension

Thay vì hai vòng lặp for, chúng ta cũng có thể dùng phương thức chain từ itertools. Sử dụng list comprehension áp dụng logic tương tự và lấy kết quả với các cột được tách ở giữa list cho trước.

Ví dụ

from itertools import chain
x = [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]
# Sử dụng list slicing và list comprehension
print("Đầu vào cho trước là : \n" + str(x))
res = list(chain(*[list((n[2:], [n[0:2]])) for n in x]))
print("Chuyển đổi cột thành các phần tử riêng biệt trong list lồng nhau : \n" + str(res))

Kết quả

Chạy đoạn code trên cho kết quả sau:

Đầu vào cho trước là : [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60]]
Chuyển đổi cột thành các phần tử riêng biệt trong list lồng nhau : [[15, 20], [[5, 10]], [35, 40], [[25, 30]], [55, 60], [[45, 50]]]