Python列表中的元组列表

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阅读起来要容易得多.


Rus*_*hal 5

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)

参考:列表理解