2012-02-28 3 views
2

Я думаю, его называют кусочком ...Python - срез списка списка

в основном у меня есть список списков:

[['fmt/10', 3L, 5L, Decimal('9500')], 
['fmt/353', 1L, 1L, Decimal('500')], 
['fmt/7', 3L, 5L, Decimal('9500')], 
['fmt/8', 3L, 5L, Decimal('9500')], 
['fmt/9', 3L, 5L, Decimal('9500')]] 

, и я хочу, чтобы вытащить 4 новые списки, все в позиции [0], [1], [2] и [3].

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

A = ['fmt/10', 'fmt/353','fmt/7','fmt/8','fmt/9'] 
B = [3,1,3,3,3] 
C = [5,1,5,5,5] 
D = [9500,500,9500,9500,9500] 

Что самый простой способ для достижения этой цели? От чтения вокруг я думаю, что хочу использовать «zip», но я не уверен, как это работает.

+1

Кстати, это называется матричной транспозицией. – strcat

ответ

11
L = [['fmt/10', 3L, 5L, Decimal('9500')], 
    ['fmt/353', 1L, 1L, Decimal('500')], 
    ['fmt/7', 3L, 5L, Decimal('9500')], 
    ['fmt/8', 3L, 5L, Decimal('9500')], 
    ['fmt/9', 3L, 5L, Decimal('9500')]] 

zip(*L) (звездочка используется для распаковки списка) даст:

[('fmt/10', 'fmt/353', 'fmt/7', 'fmt/8', 'fmt/9'), 
(3L, 1L, 3L, 3L, 3L), 
(5L, 1L, 5L, 5L, 5L), 
(Decimal('9500'), Decimal('500'), Decimal('9500'), Decimal('9500'), Decimal('9500'))] 

и вы можете использовать назначение деструктурирующие:

A, B, C, D = zip(*L) 
+0

И это действительно так просто. Спасибо! Конечно, он работает так, как ожидалось. –

+0

yup, иначе вам нужно было бы сделать что-то вроде [[l [i] для l в L] для i в диапазоне (4)] –

1
A, B, C, D = apply(zip, [['fmt/10', 3L, 5L, Decimal('9500')], 
         ['fmt/353', 1L, 1L, Decimal('500')], 
         ['fmt/7', 3L, 5L, Decimal('9500')], 
         ['fmt/8', 3L, 5L, Decimal('9500')], 
         ['fmt/9', 3L, 5L, Decimal('9500')]]) 
+3

Примечание: в документации на python указано, что apply() устарел после python2.3 и распаковки с * следует использовать вместо этого. Функция apply была удалена в python3. – strcat

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