Zugriff auf einen Wert in einem Tupel in einer Liste


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

Wie gebe ich den 2. Wert von jedem Tupel in dieser Liste zurück?

Gewünschte Ausgabe:

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

Antworten:


98

Mit einem Listenverständnis .

[x[1] for x in L]

52
Ich verstehe, dass dies eine einfache Frage ist. Ist SO so ein elitärer Ort? Versuchen Sie, die Frage zu googeln, die Ergebnisse sind nicht das, was ich brauche. Ich habe Python auf die harte Tour gelernt und ich habe es dort nicht gefunden. Ich habe bereits zuvor Fragen zum besten Ansatz zum Erlernen von Python gestellt. Die einstimmige Antwort besteht darin, ein einfaches Buch zu erhalten und einfach einzutauchen. Es frustriert mich und ich kann die Lösung in keinem Buch oder Online-Material finden, das ich suche für so weit? Außerdem ist Ihr Kommentar wirklich nicht hilfreich und hält Neulinge davon ab, auf SO zu posten.
Super9

1
@Nai: Ich schlage vor, das Python-Tutorial zu lesen: docs.python.org/tutorial/index.html . Im Allgemeinen ist die Dokumentation sehr gut. Und manchmal muss man es einfach versuchen;)
Felix Kling

19
Ich habe "Zugriff auf ein Element in Tupel" mit der Absicht gegoogelt, auf ein Element in einer Tupelliste zuzugreifen. Es brachte mich zu Ihrer Frage, also danke. Ich bin ziemlich neu in Python und finde die Antwort nicht besonders intuitiv, aber das bin nur ich!
Patrick Williams

7
Ich dachte, das gesamte Konzept mit SO sollte es einfacher machen, Antworten auf Ihre Fragen zu finden. Warum muss eine Frage eine gewisse Schwierigkeit haben, um gültig zu sein? Gute Frage, gute Antwort.
Sceluswe

2
Brillant! Eine kurze, scharfe, auf den Punkt Antwort auf eine kurze, scharfe, auf den Punkt Frage. Ihr beide habt gerade meinen Tag gemacht!
Eric M

81

Ignacios Antwort ist was Sie wollen. Als jemand, der auch Python lernt, möchte ich versuchen, es für Sie zu zerlegen ... Wie bereits erwähnt, handelt es sich um ein Listenverständnis (das beispielsweise in DiveIntoPython3 behandelt wird). Hier sind einige Punkte:

[x[1] for x in L]

  • Beachten Sie die []'s um die Codezeile. Diese definieren eine Liste. Dies sagt Ihnen, dass dieser Code eine Liste zurückgibt, also vom listTyp. Daher wird diese Technik als "Listenverständnis" bezeichnet.
  • L ist Ihre ursprüngliche Liste. Sie sollten also L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]vor der Ausführung des obigen Codes definieren.
  • xist eine Variable, die gibt es nur im Verständnis - Versuch , den Zugang xaußerhalb des Verstehens oder die Art type(x)nach der obigen Linie Ausführung und es wird Ihnen sagen NameError: name 'x' is not defined, während type(L)Renditen <class 'list'>.
  • x[1]zeigt auf das zweite Element in jedem der Tupel, während x[0]auf jedes der ersten Elemente verweisen würde.
  • Diese Codezeile lautet also wörtlich "Geben Sie das zweite Element in einem Tupel für alle Tupel in Liste L zurück."

Es ist schwer zu sagen, wie oft Sie das Problem versucht haben, bevor Sie die Frage gestellt haben, aber vielleicht waren Sie mit dem Verständnis einfach nicht vertraut? Ich würde einige Zeit damit verbringen, Kapitel 3 von DiveIntoPython oder eine Ressource zum Verständnis durchzulesen . Viel Glück.


4
In 2.x xexistiert außerhalb des LC, wobei der letzte Wert daran gebunden ist. Dies ist in 3.x behoben.
Ignacio Vazquez-Abrams

Das habe ich nicht bemerkt. Danke für die Information.
Gary

4
Tolle Erklärung @gary. Ich schätze besonders Ihren Hinweis darauf, worauf sich L bezieht.
Patrick Williams

Vielen Dank für das Feedback @PatrickWilliams. Ich bin froh, dass das hilft. Sie könnten es auch tun, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]aber es ist nicht so einfach für die Augen.
Gary

5

Ein Listenverständnis ist der absolute Weg, dies zu tun. Ein anderer Weg, der schneller sein sollte , ist mapund itemgetter.

import operator

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

Als Antwort auf den Kommentar, dass das OP auf Google keine Antwort finden konnte, werde ich einen super naiven Weg aufzeigen, dies zu tun.

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

Dies verwendet:

  1. Deklarieren einer Variablen als Referenz auf eine leere Liste.
  2. Eine for-Schleife.
  3. Aufruf der appendMethode in einer Liste.

Wenn jemand versucht, eine Sprache zu lernen und diese grundlegenden Teile nicht für sich selbst zusammenstellen kann, muss er sie als Übung betrachten und selbst ausführen, selbst wenn es zwanzig Stunden dauert.

Man muss lernen , über das nachzudenken, was man will, und das mit den verfügbaren Werkzeugen vergleichen . Jedes Element in meiner zweiten Antwort sollte in einem grundlegenden Tutorial behandelt werden. Sie können nicht lernen zu programmieren, ohne eines zu lesen .


2

ODER Sie können verwenden 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]
>>> 

Oder 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

Sie können das Entpacken von Sequenzen auch verwenden mit 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)

Dies erzeugt auch ein Tupel _aus den verworfenen ersten Elementen. Es ist möglich, nur die zweite zu extrahieren, aber ausführlicher:

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
Bitte erläutern Sie Ihre Antwort ein wenig, damit sie für andere, die danach suchen, leichter verständlich wird.
Herrbischoff
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.