Получить первый элемент каждого кортежа в списке в Python
SQL-запрос дает мне список кортежей, например:
[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...]
Я хотел бы иметь все первые элементы каждого кортежа. Сейчас я использую это:
rows = cur.fetchall()
res_list = []
for row in rows:
res_list += [row[0]]
Но я думаю, что для этого может быть лучший синтаксис. Вы знаете лучший способ?
Ответы
Ответ 1
Используйте понимание :
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]
>>>
Оба метода практически делают одно и то же, поэтому вы можете выбрать то, что вам нравится.
Ответ 2
Если вы не хотите использовать понимание по некоторым причинам, вы можете использовать map и operator.itemgetter:
>>> from operator import itemgetter
>>> rows = [(1, 2), (3, 4), (5, 6)]
>>> map(itemgetter(1), rows)
[2, 4, 6]
>>>
Ответ 3
Вы можете использовать понимание списка:
res_list = [i[0] for i in rows]
Это должно сделать трюк
Ответ 4
Функциональный способ достижения этого состоит в том, чтобы разархивировать список, используя:
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)
Ответ 5
res_list = [x[0] for x in rows]
c.f. http://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
Для обсуждения того, почему следует предпочитать понимание функций более высокого порядка, таких как map
, перейдите к http://www.artima.com/weblogs/viewpost.jsp?thread=98196.