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.

2voto

Nisan.H Punkte 5694

Ich würde dies als Kommentar zu Triptychon einfügen, aber ich kann noch nicht kommentieren, da mir die Bewertung fehlt:

Verwendung der Enumerator-Methode für den Abgleich mit Teilindizes in einer Liste von Tupeln. z.B.

li = [(1,2,3,4), (11,22,33,44), (111,222,333,444), ('a','b','c','d'),
        ('aa','bb','cc','dd'), ('aaa','bbb','ccc','ddd')]

# want pos of item having [22,44] in positions 1 and 3:

def getIndexOfTupleWithIndices(li, indices, vals):

    # if index is a tuple of subindices to match against:
    for pos,k in enumerate(li):
        match = True
        for i in indices:
            if k[i] != vals[i]:
                match = False
                break;
        if (match):
            return pos

    # Matches behavior of list.index
    raise ValueError("list.index(x): x not in list")

idx = [1,3]
vals = [22,44]
print getIndexOfTupleWithIndices(li,idx,vals)    # = 1
idx = [0,1]
vals = ['a','b']
print getIndexOfTupleWithIndices(li,idx,vals)    # = 3
idx = [2,1]
vals = ['cc','bb']
print getIndexOfTupleWithIndices(li,idx,vals)    # = 4

1voto

dulce ambrocio Punkte 11

Ok, es könnte ein Fehler sein in vals(j) so lautet die Korrektur:

def getIndex(li,indices,vals):
for pos,k in enumerate(lista):
    match = True
    for i in indices:
        if k[i] != vals[indices.index(i)]:
            match = False
            break
    if(match):
        return pos

1voto

o17t H1H' S'k Punkte 2184
z = list(zip(*tuple_list))
z[1][z[0].index('persimon')]

0voto

tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]

def eachtuple(tupple, pos1, val):
    for e in tupple:
        if e == val:
            return True

for e in tuple_list:
    if eachtuple(e, 1, 7) is True:
        print tuple_list.index(e)

for e in tuple_list:
    if eachtuple(e, 0, "kumquat") is True:
        print tuple_list.index(e)

0voto

Wallebot Punkte 677

Dies ist auch mit Lambda-Ausdrücken möglich:

l = [('rana', 1, 1), ('pato', 1, 1), ('perro', 1, 1)]
map(lambda x:x[0], l).index("pato") # returns 1 
Bearbeiten, um Beispiele hinzuzufügen:
l=[['rana', 1, 1], ['pato', 2, 1], ['perro', 1, 1], ['pato', 2, 2], ['pato', 2, 2]]

alle Artikel nach Zustand extrahieren:

filter(lambda x:x[0]=="pato", l) #[['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]]

alle Elemente nach Bedingung mit Index extrahieren:

>>> filter(lambda x:x[1][0]=="pato", enumerate(l))
[(1, ['pato', 2, 1]), (3, ['pato', 2, 2]), (4, ['pato', 2, 2])]
>>> map(lambda x:x[1],_)
[['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]]

Note : Die _ funktioniert nur im interaktiven Interpreter. Allgemeiner ausgedrückt, muss man explizit _ d.h. _=filter(lambda x:x[1][0]=="pato", enumerate(l)) .

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