2012-06-27 2 views

ответ

7

Используйте 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] 
+0

Вариант распаковки является самым быстрым (на моем Python 2.7, используя список из миллиона элементов без совместного использования структуры в кортежах). Различия довольно малы. –

0
a = [(1,2)] * 4 
first_els = [x[0] for x in a] 
+3

Не используйте 'tuple' в качестве имени переменной. В частности, не используйте его как имя списка! –

+0

Отличный улов, исправленный – ply

6

Две альтернативы То'с phihag список понимание:

[x for x, y in a] 

from operator import itemgetter 
map(itemgetter(0), a) 
4

Есть несколько пути:

>>> 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 для самого переработанного кода для работы на '[(1,2)] * 4'. – phihag

+3

@phihag Никогда не пропустите возможность использовать простые примеры, чтобы представить весь спектр возможностей Python :-) Я предполагаю, что у OP будет более интересные наборы данных для работы;;) –

+1

@ Раймонд Хеттингер, вы правы. На практике у меня есть список более 2 миллионов таких кортежей. – user1475412

0

Если у вас есть список кортежей:

lta = [(1,2), (2,3), (44,45), (37,38)] 

доступ к первому элементу каждого кортежа будет включать в себя подписи с [0], а посещение каждого кортежа для извлечения каждого первого элемента будет включать в себя понимание списка, которое может быть присвоено переменной, как показано ниже:

resultant_list = [element[0] for element in lta] 
>>> resultant_list 
[1, 2, 44, 37] 
0

Недавно я узнал о функции zip() Python. Другой способ сделать то, что я хочу сделать здесь:

list(zip(*a)[0]) 

tup_list = zip(list1, list2) чередует два списка в список 2-кортежей, но zip(*tup_list) делает противоположное, в результате чего в списке кортеж list1 и кортеж list2.

Смежные вопросы