所以,我有x=[(12,), (1,), (3,)] (元组列表),我想要以最好的方式使用x=[12, 1, 3] (整数列表)?你能帮帮忙吗?
发布于 2013-02-27 02:22:28
你没有说你所说的“最好的”是什么意思,但你大概是指“最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)在Python3中,这相当于生成器表达式;如果需要list,则将其传递给list。在Python2中,它返回一个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-27 02:01:47
y = [i[0] for i in x]但是,这只适用于每个元组中的一个元素。
但是,如果每个元组有多个元素,则可以使用稍微复杂一点的列表理解:
y = [i[j] for i in x for j in range(len(i))]参考:List Comprehensions
发布于 2013-02-27 02:02:42
只需执行以下操作:
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]https://stackoverflow.com/questions/15096021
复制相似问题