Как извлечь энные элементы из списка кортежей?

Я пытаюсь получить энные элементы из списка кортежей.

У меня есть что-то как:

elements = [(1,1,1),(2,3,7),(3,5,10)]

Я хочу извлечь только вторые элементы каждого кортежа в список:

seconds = [1, 3, 5]

Я знаю, что это могло быть сделано с a for цикл, но я хотел знать, существует ли иначе, так как у меня есть тысячи кортежей.

99
задан Georgy 28 January 2019 в 11:42
поделиться

3 ответа

n = 1 # N. . .
[x[n] for x in elements]
167
ответ дан 24 November 2019 в 05:00
поделиться

Я знаю, что это можно сделать с помощью 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 вполне подходит.

28
ответ дан 24 November 2019 в 05:00
поделиться

Это также работает:

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)) для возврата списка кортежей.

26
ответ дан 24 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: