繁体   English   中英

将格式为M = [((a,x),(b,y)]]的列表分成M1 = [a,b]和M2 = [x,y]

[英]Separate lists of format M=[(a,x), (b,y)] into M1=[a,b] and M2=[x,y]

我下面有一个列表M,它来自外部文件(实际上,这是一个很大的列表, len(M)>10000 )。

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中的内置函数。

去做就对了:

M1, M2 = zip(*M)

M1和M2将是元组。 您可以根据需要将它们转换为列表:

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

或使用genexp:

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

由于使用隐式循环,因此一种比您更有效的解决方案是:

>>> [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)

你可以做

M1, M2 = zip(*M)

这适用于元组和列表。

如果您确实有一个较长的外部文件,则您的初始版本可能会更快,因为此方法将向zip发送10k参数,因此将所有内容保留在内存中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM