2011-12-26 62 views
1

我有一個列表M,其下面是一個來自外部文件(這是一個真實的大名單,len(M)>10000)。將M = [(a,x),(b,y)]格式的單獨列表分解爲M1 = [a,b]和M2 = [x,y]

M = [(1,100),(2,200),(3,300),(4,400)]

但是,我想將其分離成M1=[1,2,3,4]M2=[100,200,300,400] 。 這裏是我如何做到這一點的那一刻,

M1 = [] 
M2 = [] 
for M1,M2 in M: 
    M1.append(M1) 
    M2.append(M2) 

我在想,如果有一個更簡單,更有效的方式來做到這一點,它使用內置的功能在Python的解決方案。

回答

6

只要做到這一點:

M1, M2 = zip(*M) 

M1和M2將元組。你可以將其轉化爲列表,如果你想:

M1, M2 = map(list, zip(*M)) 

或用genexp:

M1, M2 = (list(i) for i in zip(*M)) 
+0

哇,謝謝。這正是我需要的。 – mikeP 2011-12-26 22:22:33

1

你可以做

M1, M2 = zip(*M) 

,對於元組和列表的作品。

如果你確實有一個很長的外部文件,你的初始版本可能會更快,因爲這種方法會將10k個參數發送到zip,因此將所有內容保留在內存中。

2

一個解決方案,比你的更有效,因爲它使用隱式的循環是:

>>> [m1 for m1, _ in M] 
>>> [1, 2, 3, 4] 
>>> [m2 for _, m2 in M] 
>>> [100, 200, 300, 400] 

但使用*運營商和zip更好:

>>> M1, M2 = zip(*M) 
>>> M1 
(1, 2, 3, 4) 
>>> M2 
(100, 200, 300, 400) 
相關問題