2011-12-26 58 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) 
相关问题