首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >到int列表的元组的Python列表

到int列表的元组的Python列表
EN

Stack Overflow用户
提问于 2013-02-27 01:59:24
回答 5查看 17.8K关注 0票数 11

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

EN

回答 5

Stack Overflow用户

发布于 2013-02-27 02:22:28

你没有说你所说的“最好的”是什么意思,但你大概是指“最pythonic的”或“最易读的”或类似的东西。

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

代码语言:javascript
运行
复制
y = [i[0] for i in x]

然而,通常你并不真正需要一个列表,只需要一些可以迭代一次的东西。如果您在x中有十亿个元素,那么构建一个包含十亿个元素的y来一次迭代一个元素可能不是一个好主意。因此,您可以使用生成器表达式:

代码语言:javascript
运行
复制
y = (i[0] for i in x)

如果您更喜欢函数式编程,则可能更喜欢使用mapmap的缺点是您必须向它传递一个函数,而不仅仅是一个表达式,这意味着您需要使用lambda函数或itemgetter

代码语言:javascript
运行
复制
y = map(operator.itemgetter(0), x)

在Python3中,这相当于生成器表达式;如果需要list,则将其传递给list。在Python2中,它返回一个list;如果需要迭代器,请使用itertools.imap而不是map

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

代码语言:javascript
运行
复制
y = flatten(x)

如果您先看看flatten是如何实现的,然后看看chain.from_iterable是如何实现的,然后再看看chain是如何实现的,您就会注意到,您可以在内置方面编写相同的代码。但是,当flatten变得更具可读性和易读性时,为什么还要费心呢?

最后,如果您希望将泛型版本简化为嵌套列表理解(当然是生成器表达式):

代码语言:javascript
运行
复制
y = [j for i in x for j in i]

然而,嵌套的列表理解很容易出错,无论是在写还是读。(请注意,第一个给出最简单答案的人F3AR3DLEGEND也给出了嵌套理解,但却错了。如果他做不到,你确定要试一下吗?)对于非常简单的情况,它们不是太差,但我仍然认为flatten更容易阅读。

票数 13
EN

Stack Overflow用户

发布于 2013-02-27 02:01:47

代码语言:javascript
运行
复制
y = [i[0] for i in x]

但是,这只适用于每个元组中的一个元素。

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

代码语言:javascript
运行
复制
y = [i[j] for i in x for j in range(len(i))]

参考:List Comprehensions

票数 5
EN

Stack Overflow用户

发布于 2013-02-27 02:02:42

只需执行以下操作:

代码语言:javascript
运行
复制
x = [i[0] for i in x]

解释:

代码语言:javascript
运行
复制
>>> 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]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15096021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档