Доступ к значению в кортеже, который находится в списке


88
[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]

Как мне вернуть второе значение из каждого кортежа в этом списке?

Желаемый результат:

[2, 3, 5, 4, 7, 7, 8]

Ответы:


100

С пониманием списка .

[x[1] for x in L]

52
Я так понимаю, это простой вопрос. Неужели ТАК такое элитарное место? Попробуйте погуглить вопрос, результаты не то, что мне нужно. Я усердно изучал Python и не нашел там этого. Раньше я задавал вопросы о наилучшем подходе к изучению Python, и единодушный ответ - взять базовую книгу и просто погрузиться в нее. Это меня расстраивает, так как я просто не могу найти решение ни в одной книге или онлайн-материалах, которые у меня есть так далеко? К тому же ваш комментарий действительно бесполезен и отговаривает новичков от публикации на SO.
super9

1
@Nai: Предлагаю прочитать учебник по Python: docs.python.org/tutorial/index.html . В целом документация очень хорошая. А иногда просто нужно попробовать;)
Феликс Клинг

19
Я погуглил "доступ к элементу в кортеже" с намерением получить доступ к элементу в списке кортежей. Это привело меня к вашему вопросу, так что спасибо. Я новичок в Python и не считаю ответ интуитивно понятным, но это только я!
Патрик Уильямс,

7
Я думал, что вся концепция SO заключается в том, чтобы упростить поиск ответов на ваши вопросы. Почему вопрос должен иметь определенную сложность, чтобы быть действительным? Хороший вопрос, хороший ответ.
Sceluswe

3
Гениально! Короткий, резкий, по существу ответ на короткий, резкий, по существу вопрос. Вы оба только что сделали мне день!
Eric M

82

Ответ Игнасио - это то, что вы хотите. Однако, поскольку кто-то также изучает Python, позвольте мне попытаться проанализировать его для вас ... Как уже упоминалось, это понимание списка ( например , описанное в DiveIntoPython3 ). Вот несколько моментов:

[x[1] for x in L]

  • Обратите внимание на []'' вокруг строки кода. Это то, что определяет список. Это говорит вам, что этот код возвращает список, поэтому он имеет listтип. Следовательно, этот метод называется «составлением списка».
  • L - ваш исходный список. Поэтому вы должны определить L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]до выполнения вышеуказанного кода.
  • x- это переменная, которая существует только в понимании - попробуйте получить доступ xза пределами понимания или введите type(x)после выполнения вышеуказанной строки, и она сообщит вам NameError: name 'x' is not defined, тогда как type(L)вернется <class 'list'>.
  • x[1]указывает на второй элемент в каждом из кортежей, тогда как x[0]указывает на каждый из первых элементов.
  • Таким образом, эта строка кода буквально читает «вернуть второй элемент в кортеже для всех кортежей в списке L.»

Трудно сказать, сколько вы пытались решить проблему до того, как задать вопрос, но, возможно, вы просто не были знакомы с пониманием? Я бы потратил некоторое время на чтение Главы 3 DiveIntoPython или любого другого ресурса по пониманию. Удачи.


4
В 2.x он xбудет существовать вне LC, с привязанным к нему последним значением. Это исправлено в 3.x.
Игнасио Васкес-Абрамс,

Я этого не осознавал. Спасибо за информацию.
gary

4
Замечательное объяснение @gary. Я особенно ценю ваше указание на то, что имеет в виду Л.
Патрик Уильямс

Спасибо за отзыв @PatrickWilliams. Я рад, что это помогает. Вы также можете сделать это, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]но это не так просто для глаз.
Гэри

5

Составление списка - абсолютно лучший способ сделать это. Другой способ, который должен быть быстрее, - это mapи itemgetter.

import operator

new_list = map(operator.itemgetter(1), old_list)

В ответ на комментарий о том, что OP не может найти ответ в Google, я укажу на супер-наивный способ сделать это.

new_list = []
for item in old_list:
    new_list.append(item[1])

Это использует:

  1. Объявление переменной для ссылки на пустой список.
  2. Цикл for.
  3. Вызов appendметода из списка.

Если кто-то пытается выучить язык и не может собрать эти базовые элементы для себя, тогда ему нужно рассматривать это как упражнение и выполнять его самостоятельно, даже если на это уходит двадцать часов.

Необходимо научиться думать о том, чего вы хотите, и сравнивать это с доступными инструментами . Каждый элемент моего второго ответа должен быть рассмотрен в базовом руководстве. Вы не можете научиться программировать, не прочитав один .


2

ИЛИ вы можете использовать pandas:

>>> import pandas as pd
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> df=pd.DataFrame(L)
>>> df[1]
0    2
1    3
2    5
3    4
4    7
5    7
6    8
Name: 1, dtype: int64
>>> df[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>> 

Или numpy:

>>> import numpy as np
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> arr=np.array(L)
>>> arr.T[1]
array([2, 3, 5, 4, 7, 7, 8])
>>> arr.T[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>> 

1

Вы также можете использовать распаковку последовательности с помощью zip:

L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]

_, res = zip(*L)

print(res)

# (2, 3, 5, 4, 7, 7, 8)

Это также создает кортеж _из отброшенных первых элементов. Возможно извлечение только второго, но более подробного:

from itertools import islice

res = next(islice(zip(*L), 1, None))

0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))

1
Пожалуйста, объясните свой ответ немного, чтобы его было легче понять другим пользователям, которые его ищут.
herrbischoff
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.