5 Stimmen

Durchsuchen eines 2-dimensionalen Tupels/einer Liste in Python

Ich möchte eine Suche nach tuple of tuples für eine bestimmte Zeichenfolge und geben den Index des übergeordneten Tupels zurück. Ich scheine häufig auf Variationen dieser Art von Suche zu stoßen.

Was ist der pythonischste Weg, dies zu tun?

I.E:

derp = (('Cat','Pet'),('Dog','Pet'),('Spock','Vulcan'))
i = None
for index, item in enumerate(derp):
    if item[0] == 'Spock':
         i = index
         break
>>>print i
2

Ich könnte dies in eine kleine Dienstprogrammfunktion verallgemeinern, die eine iterable, einen Index (ich habe hart codiert 0 im Beispiel) und einen Suchwert. Es tut den Trick, aber ich habe diese Idee, dass es wahrscheinlich ein Einzeiler für es ;)

I.E:

def pluck(iterable, key, value):
    for index, item in enumerate(iterable):
        if item[key] == value:
             return index
    return None

5voto

Oder Sie können es tun:

dict(derp)[<key_name>]

z. B.

dict(derp)['Cat']

was Ihnen 'Pet' gibt

4voto

HS. Punkte 14636

Der Trick funktioniert, aber ich habe die Idee, dass es dafür wahrscheinlich einen Einzeiler gibt ;)

Der Einzeiler ist wahrscheinlich no die pythonische Art, es zu tun :)

Die von Ihnen verwendete Methode sieht gut aus.

Editer :

Wenn Sie süß sein wollen:

return next( (i for i,(k,v) in enumerate(items) if k=='Spock'),None)

next nimmt einen Generatorausdruck und gibt den nächsten Wert oder das zweite Argument zurück (in diesem Fall None ), sobald der Generator erschöpft ist.

1voto

Wenn Sie häufig dasselbe Tupel suchen, können Sie ein Diktat erstellen.

lookup_table = dict((key, i) for i, (key, unused) in enumerate(derp))

print lookup_table['Spock']
--> 2

0voto

Mr Shark Punkte 24994

Eine andere Möglichkeit, dies in einer Zeile zu erfassen, wäre:

[d[0] for d in derp].index("Spock")

Ich bin mir nicht sicher, ob der Iterator alle Werte auswertet, bevor er index aufruft, und daher ineffizient ist.

-1voto

ron Punkte 9194

Lambdas machen Spaß!

return reduce(
    lambda x,(i,(a,b)): i,
    filter(
        lambda (i,(a,b)): a == "Spock",
        enumerate(depr)
    ),
    None
)

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