Я пытаюсь получить энные элементы из списка кортежей.
У меня есть что-то как:
elements = [(1,1,1),(2,3,7),(3,5,10)]
Я хочу извлечь только вторые элементы каждого кортежа в список:
seconds = [1, 3, 5]
Я знаю, что это могло быть сделано с a for
цикл, но я хотел знать, существует ли иначе, так как у меня есть тысячи кортежей.
Я знаю, что это можно сделать с помощью FOR, но я хотел бы знать, есть ли другой способ
Есть другой способ. Вы также можете сделать это с помощью map и itemgetter:
>>> from operator import itemgetter
>>> map(itemgetter(1), elements)
Это все равно выполняет внутренний цикл, и это немного медленнее, чем понимание списка:
setup = 'elements = [(1,1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'
import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))
Результаты:
Method 1: 1.25699996948 Method 2: 1.46600008011
Если вам нужно выполнить итерацию по списку, то использование for
вполне подходит.
Это также работает:
zip(*elements)[1]
(в основном я публикую это, чтобы доказать самому себе, что у меня есть zip
...)
Посмотреть в действии:
>>> help(zip)
Помощь по сборке -in функция zip в модуле builtin :
zip (...)
zip (seq1 [, seq2 [...]]) -> [(seq1 [0], seq2 [ 0] ...), (...)]
Возвращает список кортежей, где каждый кортеж содержит i-й элемент из каждой из последовательностей аргументов. Возвращенный список усечен по длине до длины самой короткой последовательности аргументов.
>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> zip(*elements)
[(1, 2, 3), (1, 3, 5), (1, 7, 10)]
>>> zip(*elements)[1]
(1, 3, 5)
>>>
Изящная вещь, которую я узнал сегодня: используйте * list
в аргументах, чтобы создать список параметров для функции ...
Примечание : В Python3 zip
возвращает итератор, поэтому вместо этого используйте list (zip (* elements))
для возврата списка кортежей.