Доступ до значення у кортежі, що є у списку


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
Блискуче! Короткий, різкий, точний відповідь на коротке, різке, точне питання. Ви обоє щойно зробили мені день!
Ерік М

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. Я особливо вдячний за те, що ви вказали, на що стосується L.
Патрік Вільямс,

Дякуємо за відгук @PatrickWilliams. Я рада, що це допомагає. Ви також можете зробити, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]але це не так просто для очей.
gary

5

Розуміння списку - це абсолютно спосіб зробити це. Інший спосіб, який повинен бути швидшим - це mapі itemgetter.

import operator

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

У відповідь на коментар, що ОП не знайшов відповіді в 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.