在Python中获取列表中每个元组的第一个元素

156

一个 SQL 查询会给我一个元组列表,就像这样:

[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...]

我想要获取每个元组的第一个元素。目前我使用以下代码:

rows = cur.fetchall()
res_list = []
for row in rows:
    res_list += [row[0]]

但是我认为可能有更好的语法来完成它。你知道更好的方法吗?

5个回答

240

使用列表推导式

res_list = [x[0] for x in rows]

以下是演示:

>>> rows = [(1, 2), (3, 4), (5, 6)]
>>> [x[0] for x in rows]
[1, 3, 5]
>>>

另外,您可以使用拆包而不是x[0]


res_list = [x for x,_ in rows]

以下是一个演示:

>>> lst = [(1, 2), (3, 4), (5, 6)]
>>> [x for x,_ in lst]
[1, 3, 5]
>>>

两种方法实际上做了相同的事情,因此您可以选择任何一种。


谢谢!我没有找到关于语法x,_的文档。你知道在哪里可以找到吗? - Creak
5
@Creak - x,_ 是使用元组拆包。你说得对,关于这个的文档很难找到。我找到了这个链接和这个链接,它们应该解释了它的工作方式。此外,_只是一个普通变量。我本可以用x,y并得到相同的结果。但我没有这样做是因为在Python中惯例使用_代表仅作占位符的变量。 - user2555451
好的,我以为“_”是一个特殊字符,表示“1个或多个元素”。那样就太好了 ;) - Creak
1
你提供的列表推导式只适用于元组恰好有两个条目的情况。在Python3中,你可以使用[x for x, *the_rest in rows],其中*是“元组中其余元素”的特殊语法。对于在Python2中可用的列表推导式,请使用[iter(x).next() for x in rows] - bgschiller

43

实现这一功能的函数式方法是使用以下方式解压列表:

sample = [(2, 9), (2, 9), (8, 9), (10, 9), (23, 26), (1, 9), (43, 44)]
first,snd = zip(*sample)
print(first,snd)

(2, 2, 8, 10, 23, 1, 43) (9, 9, 9, 9, 26, 9, 44)

->

(2、2、8、10、23、1、43) (9、9、9、9、26、9、44)


24

如果由于某些原因你不想使用列表推导式,你可以使用 mapoperator.itemgetter

>>> from operator import itemgetter
>>> rows = [(1, 2), (3, 4), (5, 6)]
>>> map(itemgetter(1), rows)
[2, 4, 6]
>>>

13
你可以使用列表推导式:
res_list = [i[0] for i in rows]

这应该可以解决问题。


9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接