一个 SQL 查询会给我一个元组列表,就像这样:
[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...]
我想要获取每个元组的第一个元素。目前我使用以下代码:
rows = cur.fetchall()
res_list = []
for row in rows:
res_list += [row[0]]
但是我认为可能有更好的语法来完成它。你知道更好的方法吗?
一个 SQL 查询会给我一个元组列表,就像这样:
[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...]
我想要获取每个元组的第一个元素。目前我使用以下代码:
rows = cur.fetchall()
res_list = []
for row in rows:
res_list += [row[0]]
但是我认为可能有更好的语法来完成它。你知道更好的方法吗?
使用列表推导式:
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]
>>>
两种方法实际上做了相同的事情,因此您可以选择任何一种。
实现这一功能的函数式方法是使用以下方式解压列表:
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)
如果由于某些原因你不想使用列表推导式,你可以使用 map 和 operator.itemgetter:
>>> from operator import itemgetter
>>> rows = [(1, 2), (3, 4), (5, 6)]
>>> map(itemgetter(1), rows)
[2, 4, 6]
>>>
res_list = [i[0] for i in rows]
这应该可以解决问题。
res_list = [x[0] for x in rows]
参阅http://docs.python.org/3/tutorial/datastructures.html#list-comprehensions了解列表推导式的相关内容。
有关为什么更倾向于使用列表推导式而不是高阶函数(例如map
)的讨论,请参见http://www.artima.com/weblogs/viewpost.jsp?thread=98196。
x,_
的文档。你知道在哪里可以找到吗? - Creakx,_
是使用元组拆包。你说得对,关于这个的文档很难找到。我找到了这个链接和这个链接,它们应该解释了它的工作方式。此外,_
只是一个普通变量。我本可以用x,y
并得到相同的结果。但我没有这样做是因为在Python中惯例使用_
代表仅作占位符的变量。 - user2555451[x for x, *the_rest in rows]
,其中*
是“元组中其余元素”的特殊语法。对于在Python2中可用的列表推导式,请使用[iter(x).next() for x in rows]
。 - bgschiller