Python列表中的元组列表

时间:2013-02-26 17:59:24

标签: python list tuples

所以,我有x=[(12,), (1,), (3,)](元组列表),我想以最佳方式x=[12, 1, 3](整数列表)?你能帮忙吗?

5 个答案:

答案 0 :(得分:11)

你没有说“最好”是什么意思,但可能你的意思是“最诡异”或“最具可读性”或类似的东西。

F3AR3DLEGEND给出的列表理解可能是最简单的。任何知道如何阅读列表理解的人都会立即知道这意味着什么。

y = [i[0] for i in x]

但是,通常你不需要一个列表,只需要迭代一次。如果你在x中有十亿个元素,那么建立一个十亿元素y只是为了迭代它,一次一个元素可能是一个坏主意。因此,您可以使用生成器表达式:

y = (i[0] for i in x)

如果您更喜欢函数式编程,您可能更喜欢使用mapmap的缺点是你必须传递一个函数,而不仅仅是一个表达式,这意味着你需要使用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))]

参考:List Comprehensions

答案 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)