Dostęp do wartości w krotce znajdującej się na liście

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

Jak zwrócić drugą wartość z każdej krotki na tej liście?

Pożądane wyjście:

[2, 3, 5, 4, 7, 7, 8]
super9
źródło

Odpowiedzi:

100

Ze zrozumieniem listy .

[x[1] for x in L]
Ignacio Vazquez-Abrams
źródło
52
Rozumiem, że to proste pytanie. Czy TAK jest tak elitarnym miejscem? Spróbuj googlować, wyniki nie są tym, czego potrzebuję. Nauczyłem się Pythona na własnej skórze i nie znalazłem tego tam. Zadawałem już wcześniej pytania dotyczące najlepszego podejścia do nauki Pythona i jednogłośną odpowiedzią jest zdobycie podstawowej książki i po prostu zanurzenie się w niej. To mnie frustruje, ponieważ po prostu nie mogę znaleźć rozwiązania w żadnej książce lub materiale internetowym, którego szukam do tej pory? Dodatkowo twój komentarz naprawdę nie jest pomocny i zniechęca nowych członków do publikowania na SO.
super9
1
@Nai: Proponuję przeczytać samouczek Pythona: docs.python.org/tutorial/index.html . Ogólnie dokumentacja jest bardzo dobra. A czasem trzeba po prostu spróbować;)
Felix Kling
19
Wyszukałem w Google „dostęp do elementu w krotce” z zamiarem uzyskania dostępu do elementu na liście krotek. To doprowadziło mnie do twojego pytania, więc dziękuję. Jestem całkiem nowy w Pythonie i nie uważam odpowiedzi za szczególnie intuicyjną, ale to tylko ja!
Patrick Williams
7
Myślałem, że cała koncepcja z SO polegała na ułatwieniu znalezienia odpowiedzi na twoje pytania. Dlaczego pytanie musi być trudne, aby było ważne? Dobre pytanie, dobra odpowiedź.
Sceluswe
3
Znakomity! Krótka, ostra, rzeczowa odpowiedź na krótkie, ostre i rzeczowe pytanie. Oboje właśnie sprawiliście, że mój dzień!
Eric M
82

Odpowiedź Ignacio jest tym, czego chcesz. Jednak jako ktoś, kto również uczy się Pythona, spróbuję go dla Ciebie przeanalizować ... Jak wspomniano, jest to rozumienie list (omówione na przykład w DiveIntoPython3 ). Oto kilka punktów:

[x[1] for x in L]

  • Zwróć uwagę na []znak wokół wiersza kodu. To właśnie definiuje listę. To mówi ci, że ten kod zwraca listę, więc jest to listtyp. Dlatego technika ta nazywana jest „zrozumieniem listy”.
  • L to Twoja oryginalna lista. Dlatego powinieneś zdefiniować L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]przed wykonaniem powyższego kodu.
  • xjest zmienną, która istnieje tylko w zrozumieniu - spróbuj uzyskać dostęp xpoza zrozumieniem lub wpisz type(x)po wykonaniu powyższej linii, a powie ci NameError: name 'x' is not defined, a type(L)zwraca <class 'list'>.
  • x[1]wskazuje na drugą pozycję w każdej z krotek, natomiast x[0]wskazuje na każdą z pierwszych pozycji.
  • Więc ten wiersz kodu dosłownie brzmi: „zwróć drugi element krotki dla wszystkich krotek na liście L.”

Trudno jest powiedzieć, jak bardzo próbowałeś rozwiązać problem, zanim zadałeś pytanie, ale może po prostu nie byłeś zaznajomiony ze zrozumieniem? Spędziłbym trochę czasu na przeczytaniu rozdziału 3 DiveIntoPython lub dowolnego źródła na temat rozumień . Powodzenia.

Gary
źródło
4
W wersji 2.x xbędzie istnieć poza LC, z ostatnią wartością związaną z nim. Problem ten został rozwiązany w wersji 3.x.
Ignacio Vazquez-Abrams
Nie zdawałem sobie z tego sprawy. Dzięki za informację.
gary
4
Niesamowite wyjaśnienie @gary. Szczególnie doceniam twoje wskazanie, do czego odnosi się L.
Patrick Williams
Dzięki za informację zwrotną @PatrickWilliams. Cieszę się, że to pomaga. Możesz też to zrobić, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]ale nie jest to takie łatwe dla oczu.
gary
5

Zrozumienie listy jest absolutnym sposobem na zrobienie tego. Innym sposobem, który powinien być szybszy, jest mapi itemgetter.

import operator

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

W odpowiedzi na komentarz, że OP nie mógł znaleźć odpowiedzi w google, wskażę super naiwny sposób na zrobienie tego.

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

Wykorzystuje to:

  1. Deklarowanie zmiennej jako odniesienia do pustej listy.
  2. Pętla for.
  3. Wywołanie appendmetody z listy.

Jeśli ktoś próbuje nauczyć się języka i nie może złożyć tych podstawowych elementów dla siebie, musi potraktować to jako ćwiczenie i zrobić to samodzielnie, nawet jeśli zajmuje to dwadzieścia godzin.

Trzeba nauczyć się myśleć o tym, czego się chce i porównywać to z dostępnymi narzędziami . Każdy element mojej drugiej odpowiedzi powinien być omówiony w podstawowym samouczku. Nie możesz nauczyć się programowania bez czytania .

aaronasterling
źródło
2

LUB możesz użyć 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]
>>> 

Lub 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]
>>> 
U10-Forward
źródło
1

Możesz również użyć rozpakowywania sekwencji z 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)

Spowoduje to również utworzenie krotki _z odrzuconych pierwszych elementów. Wyodrębnienie tylko drugiego jest możliwe, ale bardziej szczegółowe:

from itertools import islice

res = next(islice(zip(*L), 1, None))
jpp
źródło
0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))
Rashmi
źródło
1
Proszę wyjaśnij trochę swoją odpowiedź, aby inni mogli ją łatwiej zrozumieć.
herrbischoff