从Python列表中提取数组

4

如果我有这样一个列表:

>>> data = [(1,2),(40,2),(9,80)]

如何提取出两个列表 [1, 40, 9] 和 [2, 2, 80]?当然,我可以迭代并自己提取这些数字,但我猜肯定有更好的方法吧?


1
这不是“提取”。有时这被称为“旋转”。你正在改变列表的结构,而不是从中提取子集。 - S.Lott
3个回答

27

解压操作是:

In [1]: data = [(1,2),(40,2),(9,80)]
In [2]: zip(*data)
Out[2]: [(1, 40, 9), (2, 2, 80)]

编辑:您可以在赋值时分解生成的列表:

In [3]: first_elements, second_elements = zip(*data)

如果你真的需要列表作为结果:

In [4]: first_elements, second_elements = map(list, zip(*data))

为了更好地理解为什么这个方法有效:
zip(*data)

等同于

zip((1,2), (40,2), (9,80))

结果列表中的两个元组是由zip()函数的第一个参数和第二个参数中的第一个元素以及第二个元素构建而成的。

14

列表推导式拯救大局:

first = [x for (x,y) in data]
second = [y for (x,y) in data]

5

还有

In [1]: data = [(1,2),(40,2),(9,80)]
In [2]: x=map(None, *data)
Out[2]: [(1, 40, 9), (2, 2, 80)]
In [3]: map(None,*x)
Out[3]: [(1, 2), (40, 2), (9, 80)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接