Если у меня есть, например, список кортежей, таких какСоздание списка Python из списка кортежей
a = [(1,2)] * 4
как бы создать список первого элемента каждого кортежа? То есть, [1, 1, 1, 1]
.
Если у меня есть, например, список кортежей, таких какСоздание списка Python из списка кортежей
a = [(1,2)] * 4
как бы создать список первого элемента каждого кортежа? То есть, [1, 1, 1, 1]
.
Используйте list comprehension:
>>> a = [(1,2)] * 4
>>> [t[0] for t in a]
[1, 1, 1, 1]
Вы также можете распаковать кортеж:
>>> [first for first,second in a]
[1, 1, 1, 1]
Если вы хотите получить фантазии, сочетать map
и operator.itemgetter
. В Python 3, вам придется обернуть конструкцию в list
, чтобы получить список вместо итератора:
>>> import operator
>>> map(operator.itemgetter(0), a)
<map object at 0x7f3971029290>
>>> list(map(operator.itemgetter(0), a))
[1, 1, 1, 1]
a = [(1,2)] * 4
first_els = [x[0] for x in a]
Не используйте 'tuple' в качестве имени переменной. В частности, не используйте его как имя списка! –
Отличный улов, исправленный – ply
Две альтернативы То'с phihag список понимание:
[x for x, y in a]
from operator import itemgetter
map(itemgetter(0), a)
Есть несколько пути:
>>> a = [(1,2)] * 4
>>> # List comprehension
>>> [x for x, y in a]
[1, 1, 1, 1]
>>> # Map and lambda
>>> map(lambda t: t[0], a)
[1, 1, 1, 1]
>>> # Map and itemgetter
>>> import operator
>>> map(operator.itemgetter(0), a)
[1, 1, 1, 1]
методика использования карты впал в немилость, когда были введены списочные, но теперь это делает возвращение из-за параллельный Map/Reduce и многопроцессорной техника:
>>> # Multi-threading approach
>>> from multiprocessing.pool import ThreadPool as Pool
>>> Pool(2).map(operator.itemgetter(0), a)
[1, 1, 1, 1]
>>> # Multiple processes approach
>>> from multiprocessing import Pool
>>> def first(t):
return t[0]
>>> Pool(2).map(first, a)
[1, 1, 1, 1]
+1 для самого переработанного кода для работы на '[(1,2)] * 4'. – phihag
@phihag Никогда не пропустите возможность использовать простые примеры, чтобы представить весь спектр возможностей Python :-) Я предполагаю, что у OP будет более интересные наборы данных для работы;;) –
@ Раймонд Хеттингер, вы правы. На практике у меня есть список более 2 миллионов таких кортежей. – user1475412
Если у вас есть список кортежей:
lta = [(1,2), (2,3), (44,45), (37,38)]
доступ к первому элементу каждого кортежа будет включать в себя подписи с [0], а посещение каждого кортежа для извлечения каждого первого элемента будет включать в себя понимание списка, которое может быть присвоено переменной, как показано ниже:
resultant_list = [element[0] for element in lta]
>>> resultant_list
[1, 2, 44, 37]
Недавно я узнал о функции zip()
Python. Другой способ сделать то, что я хочу сделать здесь:
list(zip(*a)[0])
tup_list = zip(list1, list2)
чередует два списка в список 2-кортежей, но zip(*tup_list)
делает противоположное, в результате чего в списке кортеж list1
и кортеж list2
.
Вариант распаковки является самым быстрым (на моем Python 2.7, используя список из миллиона элементов без совместного использования структуры в кортежах). Различия довольно малы. –