那么,我有x=[(12,), (1,), (3,)]
(元组列表)并且我想要x=[12, 1, 3]
(整数列表)以最好的方式?你能帮忙吗?
5 回答
你没有说“最好”是什么意思,但大概你的意思是“最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
它更容易阅读。
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]
解释:
>>> 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)