2012-02-28 29 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