2012-02-28 30 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] 

请告诉我最简单的方法来实现这一目标? 从阅读我认为我想使用'拉链',但我不知道这是如何工作。

+1

顺便说一句,这被称为矩阵转置。 – strcat 2012-02-28 07:00:25

回答

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

真的很简单。谢谢!当然,它按预期工作。 – 2012-02-28 06:57:23

+0

yup,否则你将不得不做类似于[[l [i] for l in L] for i in range(4)] – 2012-02-28 07:04:46

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开始已被弃用,并且解包用*代替。 python3中删除了apply函数。 – strcat 2012-02-28 07:03:16