所以,我有x=[(12,), (1,), (3,)]
(元组列表),我想以最佳方式x=[12, 1, 3]
(整数列表)?你能帮忙吗?
答案 0 :(得分:11)
你没有说“最好”是什么意思,但可能你的意思是“最诡异”或“最具可读性”或类似的东西。
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
更容易阅读。
答案 1 :(得分:5)
y = [i[0] for i in x]
这仅适用于每个元组一个元素。
但是,如果每个元组有多个元素,则可以使用稍微复杂的列表理解:
y = [i[j] for i in x for j in range(len(i))]
答案 2 :(得分:2)
这样做:
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]
答案 3 :(得分:1)
这是最有效的方式:
x = [i for i, in x]
或等同于
x = [i for (i,) in x]
这有点慢:
x = [i[0] for i in x]
答案 4 :(得分:0)
你可以使用地图功能......
map(lambda y: y[0], x)