11

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

4

5 回答 5

13

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

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)

在 Python 3 中,这相当于生成器表达式;如果你想要一个list,把它传递给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它更容易阅读。

于 2013-02-26T18:22:27.757 回答
5
y = [i[0] for i in x]

不过,这只适用于每个元组的一个元素。

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

y = [i[j] for i in x for j in range(len(i))]

参考:列表理解

于 2013-02-26T18:01:47.063 回答
2

只需这样做:

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]
于 2013-02-26T18:02:42.130 回答
1

这是最有效的方法:

x = [i for i, in x]

或者,等效地

x = [i for (i,) in x]

这有点慢:

x = [i[0] for i in x]
于 2013-02-26T18:04:38.523 回答
0

你可以使用地图功能......

map(lambda y: y[0], x)
于 2013-02-26T18:07:22.437 回答