Nul*_*ion 10 python tuples list
那么,我有x=[(12,), (1,), (3,)]
(元组列表)和我想要的x=[12, 1, 3]
(整数列表)尽可能最好的方式?你能帮忙吗?
aba*_*ert 13
你没有说"最好"是什么意思,但可能你的意思是"最pythonic"或"最可读"或类似的东西.
F3AR3DLEGEND给出的列表理解可能是最简单的.任何知道如何阅读列表理解的人都会立即知道这意味着什么.
y = [i[0] for i in x]
Run Code Online (Sandbox Code Playgroud)
但是,通常您不需要列表,只需要迭代一次.如果你有十亿个元素x
,建立一个十亿元素y
只是迭代它一次一个元素可能是一个坏主意.所以,你可以使用生成器表达式:
y = (i[0] for i in x)
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢函数式编程,您可能更喜欢使用map
.缺点map
是你必须传递一个函数,而不仅仅是一个表达式,这意味着你需要使用一个lambda
函数,或者itemgetter
:
y = map(operator.itemgetter(0), x)
Run Code Online (Sandbox Code Playgroud)
在Python 3中,这相当于生成器表达式; 如果你想要一个list
,把它传递给list
.在Python 2中,它返回一个list
; 如果你想要一个迭代器,请使用itertools.imap
而不是map
.
如果你想要一个更通用的展平解决方案,你可以自己编写一个解决方案,但是总是值得寻找itertools
这种通用解决方案,实际上有一个名为flatten
"Flatten one level of nesting" 的配方.因此,将其复制并粘贴到您的代码(或pip install more-itertools
)中,您可以这样做:
y = flatten(x)
Run Code Online (Sandbox Code Playgroud)
如果你看看如何flatten
实现,然后是如何chain.from_iterable
实现,然后是如何chain
实现,你会注意到你可以用内置的方式编写相同的东西.但为什么要麻烦,何时flatten
会更具可读性和显而易见性?
最后,如果要将通用版本减少为嵌套列表推导(或者当然是生成器表达式):
y = [j for i in x for j in i]
Run Code Online (Sandbox Code Playgroud)
但是,嵌套列表推导在写作和阅读方面都很容易出错.(请注意,F3AR3DLEGEND,同一个给出最简单答案的人,也给出了嵌套理解并弄错了.如果他不能把它拉下来,你确定要尝试吗?)对于非常简单的情况,他们'不过不错,但我认为flatten
阅读起来要容易得多.
y = [i[0] for i in x]
Run Code Online (Sandbox Code Playgroud)
但这仅适用于每个元组一个元素.
但是,如果每个元组有多个元素,则可以使用稍微复杂的列表解析:
y = [i[j] for i in x for j in range(len(i))]
Run Code Online (Sandbox Code Playgroud)
参考:列表理解