所以,我有一个列表嵌套元组的变量x=[(12,), (1,), (3,)]
,我想要最好的方法将其转换为只包含整数的列表x=[12, 1, 3]
?你能帮忙吗?
您没有说明“最好”的含义,但是可以推测您的意思是“最符合Python风格”或“最易读”之类的。
F3AR3DLEGEND提供的列表推导式可能是最简单的。任何知道如何阅读列表推导式的人都会立即知道它的含义。
y = [i[0] for i in x]
然而,通常情况下你并不需要一个列表,只需要能够迭代一次的东西。如果你有十亿个元素在 x
中,建立一个包含十亿个元素的 y
只是为了逐个遍历可能是一个坏主意。因此,你可以使用生成器表达式:
y = (i[0] for i in x)
map
。 map
的缺点是你需要传递一个函数而不仅仅是一个表达式,这意味着你要么需要使用一个lambda
函数,要么使用itemgetter
。y = map(operator.itemgetter(0), x)
list
。在Python 2中,它返回一个list
;如果你想要一个迭代器,请使用itertools.imap
而不是map
。itertools
以获取此类通用解决方案,实际上有一个名为flatten
的配方,用于“展平一层嵌套”。因此,将其复制并粘贴到您的代码中(或pip install more-itertools
),您就可以这样做:y = flatten(x)
flatten
的实现方式,然后查看chain.from_iterable
的实现方式,再查看chain
的实现方式,您会注意到您可以使用内置函数编写相同的代码。但是为什么要这样做呢?flatten
更易读且更明显。最后,如果您想将通用版本简化为嵌套列表推导式(或生成器表达式),当然也可以:
y = [j for i in x for j in i]
然而,嵌套的列表推导式在编写和阅读时很容易出错。(请注意,第一个给出最简单答案的F3AR3DLEGEND也给出了一个嵌套推导式并且出错了。如果他都做不到,你确定你想尝试吗?)对于非常简单的情况,它们还好,但是我认为flatten
更容易阅读。
y = [i[0] for i in x]
虽然如此,如果你的元组中有多个元素,你可以使用稍微复杂一些的列表推导式:
y = [i[j] for i in x for j in range(len(i))]
参考资料: 列表推导式
for
的顺序吗? - phant0mrange(len(i))
来获取索引值呢?i[j] for j in range(len(i))
和j for j in i
完全相同。 - abarnert只需按照以下步骤进行:
x = [i[0] for i in x]
解释:
>>> x=[(12,), (1,), (3,)]
>>> x
[(12,), (1,), (3,)]
>>> [i for i in x]
[(12,), (1,), (3,)]
>>> [i[0] for i in x]
[12, 1, 3]
x = [i for i, in x]
x = [i for (i,) in x]
x = [i[0] for i in x]
list
进行快速测试,它们分别需要4.15ms和4.14ms - 看起来超过4ms的时间都花费在迭代列表和构建新列表上,因此没有任何更快的方法。如果将x更改为genexp,并将两个listcomps替换为馈入deque(genexp, maxlen=0)
的genexp,则我得到1.36us vs. 1.32us。 - abarnert你可以使用map函数....
map(lambda y: y[0], x)
map
,最好使用 itemgetter
而不是 lambda
。 - abarnert
(n,)
? - Pedro del Solzip(*x)[0]
或next(zip(*x))
的另一种选择。 - JBernardo