72 Stimmen

Pythons Methode list index() auf eine Liste von Tupeln oder Objekten anwenden?

Pythons Listentyp hat eine index()-Methode, die einen Parameter annimmt und den Index des ersten Elements in der Liste zurückgibt, das dem Parameter entspricht. Zum Beispiel:

>>> some_list = ["apple", "pear", "banana", "grape"]
>>> some_list.index("pear")
1
>>> some_list.index("grape")
3

Gibt es eine elegante (idiomatische) Möglichkeit, dies auf Listen komplexer Objekte, wie Tupel, auszuweiten? Im Idealfall möchte ich in der Lage sein, so etwas wie dieses zu tun:

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> some_list.getIndexOfTuple(1, 7)
1
>>> some_list.getIndexOfTuple(0, "kumquat")
2

getIndexOfTuple() ist nur eine hypothetische Methode, die einen Subindex und einen Wert akzeptiert und dann den Index des Listenelements mit dem angegebenen Wert an diesem Subindex zurückgibt. Ich hoffe

Gibt es eine Möglichkeit, dieses allgemeine Ergebnis zu erreichen, indem man Listenauflösungen oder Lambas oder etwas ähnliches "in-line" verwendet? Ich denke, ich könnte meine eigene Klasse und Methode schreiben, aber ich möchte nicht das Rad neu erfinden, wenn Python bereits eine Möglichkeit, es zu tun hat.

0voto

dspmeng Punkte 1

Pythons list.index(x) gibt den Index des ersten Vorkommens von x in der Liste zurück. Wir können also Objekte übergeben, die von der Listenkomprimierung zurückgegeben werden, um ihren Index zu erhalten.

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1]
>>> [tuple_list.index(t) for t in tuple_list if t[0] == 'kumquat']
[2]

Mit der gleichen Zeile können wir auch die Liste der Indizes abrufen, falls es mehrere übereinstimmende Elemente gibt.

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11), ("banana", 7)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1, 4]

0voto

jerome Punkte 183

Ich schätze, dass das Folgende nicht der beste Weg ist, um es zu tun (Geschwindigkeit und Eleganz Bedenken), aber gut, es könnte helfen:

from collections import OrderedDict as od
t = [('pineapple', 5), ('cherry', 7), ('kumquat', 3), ('plum', 11)]
list(od(t).keys()).index('kumquat')
2
list(od(t).values()).index(7)
7
# bonus :
od(t)['kumquat']
3

Liste von Tupeln mit 2 Mitgliedern kann direkt in ein geordnetes Diktat umgewandelt werden, die Datenstrukturen sind im Grunde die gleichen, so dass wir die Diktat-Methode im laufenden Betrieb verwenden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X