你没有说“最好”是什么意思,但大概你的意思是“最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 http://docs.python.org/2/library/itertools.html#recipes对于此类通用解决方案,实际上有一个名为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
更容易阅读。