从元组列表中创建三个变量

时间:2017-05-25 21:18:06

标签: python

假设我有一个像下面这样的元组列表

counts=[(0,0,17),(0,0,90)]

我想创建三个变量或列表,例如

a b c 
0 0 17 
0 0 90

我想使用List comprehensions来做到这一点。

我的计数是地图功能的结果。我想将值分配给三个不同的pandas列为a,b和c。

建议?

5 个答案:

答案 0 :(得分:5)

您不需要 list comprehension 来实现此目的。 Python内置zip函数,根据列表元素的索引将列表解压缩为:

>>> counts=[(0,0,17),(0,0,90)]
>>> a, b, c = zip(*counts)

>>> a
(0, 0)

>>> b
(0, 0)

>>> c
(17, 90)

答案 1 :(得分:2)

你走了:

a,b,c = [ [i[j] for i in counts] for j in range(0,3)]

请注意嵌套理解 - here's a good resource描述它们的工作原理。

答案 2 :(得分:1)

有很多方法。如果您打算使用表格数据,请考虑使用pandas

import pandas as pd

counts=[(0,0,17),(0,0,90)]
df = pd.DataFrame(counts)
df.columns=["a", "b", "c"]

现在,在python shell中,df看起来像:

Out[3]:
    a   b   c
0   0   0   17
1   0   0   90

第一列有索引,基本上是表上的主键。要恢复任何列表,您只需执行

df.a

生成一个Series类型,其值为int64:

Out[11]:
 0    0
 1    0
Name: a, dtype: int64

再次,显示的第一列是索引(零索引像普通的python列表一样)。

您可以熟悉的方式访问系列中的值:

df.a[0]

Out[12]:
0

最后,如果您需要返回一个列表,您只需执行

即可
a = list(df.a)

等等。

答案 3 :(得分:0)

如果出于某种原因想要动态创建变量,可以按如下方式更新counts=[(0,0,17),(0,0,90)] globals().update({k: t for k, t in zip('abc', zip(*counts))}) # In [23]: c # Out[23]: (17, 90)

{{1}}

答案 4 :(得分:0)

如果使用numpy:

import numpy as np

print(np.array(counts).transpose())

输出

[[ 0  0]
 [ 0  0]
 [17 90]]

当然,我们可以将3x2数组解压缩到abc

a, b, c = np.array(counts).transpose()