Accesso a un valore in una tupla che si trova in un elenco


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

Come restituisco il secondo valore da ogni tupla all'interno di questo elenco?

Uscita desiderata:

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

Risposte:


101

Con una lista di comprensione .

[x[1] for x in L]

53
Capisco che questa sia una domanda semplice. È così un posto così elitario? Prova a cercare su Google la domanda, i risultati non sono ciò di cui ho bisogno. Ho imparato il pitone nel modo più duro e non l'ho trovato lì dentro. Ho fatto domande in passato sull'approccio migliore per imparare Python e la risposta unanime è quella di prendere un libro di base e semplicemente tuffarmi. Mi frustra così come non riesco a trovare la soluzione in nessun libro o materiale online che cerco per finora? Inoltre il tuo commento non è davvero utile e scoraggia i nuovi membri dal postare su SO.
super9

1
@Nai: suggerisco di leggere il tutorial di Python: docs.python.org/tutorial/index.html . In generale, la documentazione è molto buona. E a volte, bisogna solo provare;)
Felix Kling

19
Ho cercato su Google "l'accesso all'elemento nella tupla" con l'intento di accedere a un elemento in un elenco di tupla. Mi ha portato alla tua domanda, quindi grazie. Sono abbastanza nuovo in Python e non trovo la risposta particolarmente intuitiva, ma sono solo io!
Patrick Williams

8
Ho pensato che l'intero concetto con SO fosse quello di rendere più facile trovare le risposte alle tue domande. Perché una domanda deve avere una certa difficoltà per essere valida? Bella domanda, buona risposta.
Sceluswe

3
Brillante! Una risposta breve, tagliente, puntuale a una domanda breve, tagliente, puntuale. Entrambi avete appena reso la mia giornata!
Eric M

82

La risposta di Ignacio è quello che vuoi. Tuttavia, poiché qualcuno sta imparando anche Python, lascia che provi a sezionarlo per te ... Come accennato, è una comprensione di liste (trattata in DiveIntoPython3 , per esempio). Ecco alcuni punti:

[x[1] for x in L]

  • Notare la []s attorno alla riga di codice. Questi sono ciò che definisce un elenco. Questo ti dice che questo codice restituisce un elenco, quindi è del listtipo. Quindi, questa tecnica è chiamata "comprensione delle liste".
  • L è la tua lista originale. Quindi dovresti definire L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]prima di eseguire il codice sopra.
  • xè una variabile che esiste solo nella comprensione - prova ad accedere xal di fuori della comprensione, o digita type(x)dopo aver eseguito la riga sopra e te lo dirà NameError: name 'x' is not defined, mentre type(L)ritorna <class 'list'>.
  • x[1]punta al secondo elemento in ciascuna delle tuple mentre punterebbe x[0]a ciascuno dei primi elementi.
  • Quindi questa riga di codice legge letteralmente "restituisci il secondo elemento in una tupla per tutte le tuple nell'elenco L."

È difficile dire quanto hai tentato di risolvere il problema prima di porre la domanda, ma forse non avevi familiarità con la comprensione? Passerei un po 'di tempo a leggere il Capitolo 3 di DiveIntoPython o qualsiasi risorsa sulla comprensione. In bocca al lupo.


4
In 2.x, xesisterà al di fuori di LC, con l'ultimo valore associato ad esso. Questo problema è stato risolto in 3.x.
Ignacio Vazquez-Abrams,

Non me ne rendevo conto. Grazie per le informazioni.
gary

4
Fantastica spiegazione @gary. Apprezzo in particolare che tu mi abbia fatto notare a cosa si riferisce L.
Patrick Williams

Grazie per il feedback @PatrickWilliams. Sono contento che questo aiuti. Potresti anche farlo, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]ma non è così facile per gli occhi.
gary

5

Una comprensione della lista è assolutamente il modo per farlo. Un altro modo che dovrebbe essere più veloce è mape itemgetter.

import operator

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

In risposta al commento che l'OP non è riuscito a trovare una risposta su Google, ti indicherò un modo super ingenuo per farlo.

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

Questo utilizza:

  1. Dichiarare una variabile per fare riferimento a un elenco vuoto.
  2. Un ciclo for.
  3. Chiamare il appendmetodo su un elenco.

Se qualcuno sta cercando di imparare una lingua e non riesce a mettere insieme questi pezzi di base da solo, deve vederlo come un esercizio e farlo da solo anche se ci vogliono venti ore.

Bisogna imparare a pensare a ciò che si vuole e confrontarlo con gli strumenti disponibili . Ogni elemento della mia seconda risposta dovrebbe essere trattato in un tutorial di base. Non puoi imparare a programmare senza leggerne uno .


2

Puoi anche usare lo spacchettamento in sequenza con 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)

Questo crea anche una tupla _dai primi elementi scartati. È possibile estrarre solo il secondo, ma più prolisso:

from itertools import islice

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

2

O puoi usare 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]
>>> 

Oppure 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]
>>> 

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

1
Spiega un po 'la tua risposta in modo che diventi più facile da capire per gli altri che la cercano.
herrbischoff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.