2015-11-23 29 views
6

Tôi có danh sách tùy ý, ví dụ ở đây là ba danh sách:Danh sách sắp xếp trong Python (transpose)

a = [1,1,1,1] 
b = [2,2,2,2] 
c = [3,3,3,3] 

Và tôi muốn transpose chúng lại với nhau để có được kết quả như thế này:

f_out = [1,2,3] 
g_out = [1,2,3] 
... 
n_out = [1,2,3] 

Như bạn có thể thấy, tôi vừa chuyển đổi "cột" thành "hàng".

Vấn đề là giải pháp phải độc lập với độ dài danh sách.

Ví dụ:

a = [1,1] 
b = [2] 
c = [3,3,3] 
# output 
f_out = [1,2,3] 
g_out = [1,3] 
n_out = [3] 
+6

Bạn có thể muốn xem xét 'itertools.zip _longest' - Đó là _almost_ những gì bạn muốn, bạn chỉ cần lọc ra phần đệm thừa. – mgilson

+0

@mgilson Cảm ơn bạn! Tôi nghĩ rằng nó có thể giúp tôi :) – Paddy

+0

Đối với bất cứ ai khác chỉ nhìn chằm chằm vào câu hỏi này và tự hỏi mối quan hệ giữa đầu vào và đầu ra là gì, nó xử lý nó gần giống như ma trận transpose. IOW, 'f',' g' và 'h' là kết quả của lớp lót' a', 'b' và' c' theo chiều ngang và đọc từ trên xuống dưới. –

Trả lời

11

Bạn có thể sử dụng zip_longest

>>> from itertools import zip_longest 
>>> a = [1,1] 
>>> b = [2] 
>>> c = [3,3,3] 
>>> f,g,h=[[e for e in li if e is not None] for li in zip_longest(a,b,c)] 
>>> f 
[1, 2, 3] 
>>> g 
[1, 3] 
>>> h 
[3] 

Nếu None là một giá trị hợp lệ tiềm năng trong danh sách, sử dụng một sentinel object thay vì mặc định None:

>>> b = [None] 
>>> sentinel = object() 
>>> [[e for e in li if e is not sentinel] for li in zip_longest(a,b,c, fillvalue=sentinel)] 
[[1, None, 3], [1, 3], [3]] 
+2

Nó là zip_longest cho python3 –

+1

@PadraicCunningham: Tốt bắt - cố định – dawg

Các vấn đề liên quan