2013-07-18 8 views
4

Это MWE от повторного arrainging мне нужно сделать:Re назначить список эффективно

a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]] 
b = [[], [], []] 

for item in a: 
    b[0].append(item[0])  
    b[1].append(item[1]) 
    b[2].append(item[2]) 

что делает b выглядеть следующим образом:

b = [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]] 

Т.е., каждый первый элемент в каждом список внутри a будет сохранен в первом списке в b и тот же для списков два и три в b.

Мне нужно применить это к несколько большому списку a, есть ли более эффективный способ сделать это?

ответ

14

Существует гораздо лучший способ перенести ваши строки и столбцы:

b = zip(*a) 

Демо:

>>> a = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]] 
>>> zip(*a) 
[(1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)] 

zip() принимает множество последовательностей в качестве аргументов и пар до элементов из каждого, чтобы сформировать новый списки. Переходя в a с аргументом splat *, мы просим Python развернуть a в отдельные аргументы до zip().

Обратите внимание, что на выходе вы получаете список кортежей; элементы карты обратно в списки по мере необходимости:

b = map(list, zip(*a)) 
+4

Простой, короткий, элегантный ... одним словом, Python :) – StoryTeller

+1

Я удивлен. Я вижу, что мне нужно узнать немного больше об этих «драгоценных камнях» python, я часто вижу, что я использую метод перебора «fortran» (как в моем примере выше) Большое спасибо. – Gabriel

+0

Впечатляющий: приятный значок в течение 15 минут. – John

Смежные вопросы