Python元组列表到int列表

Python元组列表到int列表,python,list,tuples,Python,List,Tuples,所以,我有x=[(12,),(1,),(3,)](元组列表),我想要x=[12,1,3](整数列表)以最好的方式?你能帮忙吗 y = [i[0] for i in x] 不过,这只适用于每个元组一个元素 但是,如果每个元组有多个元素,则可以使用稍微复杂一点的列表理解: y = [i[j] for i in x for j in range(len(i))] 参考资料:只需执行以下操作: x = [i[0] for i in x] y = flatten(x) 说明: >>&g

所以,我有
x=[(12,),(1,),(3,)]
(元组列表),我想要
x=[12,1,3]
(整数列表)以最好的方式?你能帮忙吗

y = [i[0] for i in x]
不过,这只适用于每个元组一个元素

但是,如果每个元组有多个元素,则可以使用稍微复杂一点的列表理解:

y = [i[j] for i in x for j in range(len(i))]
参考资料:

只需执行以下操作:

x = [i[0] for i in x]
y = flatten(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]

你可以使用地图功能

map(lambda y: y[0], x)

你没有说“最好”是什么意思,但你大概是指“最具pythonic”或“最具可读性”之类的东西

F3AR3DLEGEND给出的列表理解可能是最简单的。任何知道如何阅读理解列表的人都会立即知道它的含义

y = [i[0] for i in x]
然而,通常您并不真正需要一个列表,只需要一些可以迭代一次的东西。如果在
x
中有10亿个元素,那么构建一个10亿元素
y
只是一次迭代一个元素可能是个坏主意。因此,可以使用生成器表达式:

y = (i[0] for i in x)
如果您喜欢函数式编程,您可能更喜欢使用
map
map
的缺点是必须向其传递函数,而不仅仅是表达式,这意味着您需要使用
lambda
函数或
itemgetter

y = map(operator.itemgetter(0), x)
在Python 3中,这相当于生成器表达式;如果需要
列表
,请将其传递到
列表
。在Python 2中,它返回一个
列表
;如果需要迭代器,请使用
itertools.imap
而不是
map

如果您想要一个更通用的展平解决方案,您可以自己编写一个,但这类通用解决方案总是值得一看的,事实上有一个名为
展平
的配方,用于“展平一级嵌套”。因此,将其复制并粘贴到您的代码中(或
pip安装更多itertools
),您只需执行以下操作:

x = [i[0] for i in x]
y = flatten(x)
如果你看看
flatten
是如何实现的,然后看看
chain.from\u iterable
是如何实现的,然后看看
chain
是如何实现的,你会注意到你可以用内置的方式写同样的东西。但是当
flatte
变得更具可读性和明显时,为什么还要麻烦呢

最后,如果要将泛型版本简化为嵌套列表理解(当然是生成器表达式),请执行以下操作:


然而,嵌套列表理解在写作和阅读中都很容易出错。(请注意,F3AR3DLEGEND,即第一个给出最简单答案的人,也给出了嵌套理解,但理解错误。如果他做不到,你确定要尝试吗?)对于真正简单的案例,它们并不太糟糕,但仍然,我认为
flatte
更容易阅读。

请编辑您的问题,将您尝试的解决方案包括在内。谢谢。你的元组总是一样的吗
(n,)
?PY3K上的另一个
zip(*x)[0]
next(zip(*x))
可能是@pedro的副本-是的,它将始终有一个元素。对于第二个元素:如果您需要展平任何序列,文档中有一个名为
flatten
的配方。也许理解这一点和列表理解都是值得的。难道你不应该为s反转
的顺序吗?还有,为什么你甚至要迭代
范围(len(i))
以通过索引获得值<范围内j的code>i[j](len(i))
与i中j的
j完全相同。您确定效率差异吗?在3.3.0中使用1M元素
列表
进行的快速测试中,他们分别用了4.15ms和4.14ms,其中似乎有超过4ms是迭代列表和构建新列表所花费的时间,因此没有什么比这更快了。如果您将x更改为genexp,并用馈送到
deque(genexp,maxlen=0)
的genexp替换这两个列表组件,我得到的是1.36us vs.1.32us。更重要的是,您想象的是什么场景,有人会关心这两个列表组件中哪一个更高效?Python的效率趋势究竟来自何方?对我来说,这似乎是一个获得更多分数的把戏。@Phantom:有些人认为“最好的方式”,并立即将其解释为“最有效的方式”。我不知道为什么这些人用Python而不是C编写代码。特别是那些假设而不是测试的人,他们不认为C总是最快的吗?我在Python2.7上测试了它,这不是一个假设(34毫秒对46毫秒,列表为1M)。我想说这些方法的可读性非常接近,那么还有什么可以比较来选择“最好的”(没有人定义)?如果你要使用
map
,你最好使用
itemgetter
,而不是
lambda
。那么你对模式匹配的元组解包有什么看法?@PavelAnossov:怎么看?当您想要将元组解压到单独的命名变量中时,这显然是正确的。当你有一个元组,你只是想把它变成一个单一的值,它看起来不是很清楚,但它不是真的令人讨厌。