Ich habe eine Liste von Namen Tupeln:Python: Überprüfen Sie, ob Liste benannter Tupel enthält bestimmte Attributwert
from collections import namedtuple
T = namedtuple('T', ['attr1', 'attr2', 'attr3', 'attr4'])
t1 = T('T1', 1, '1234', 'XYZ')
t2 = T('T2', 2, '1254', 'ABC')
t3 = T('T2', 2, '1264', 'DEF')
l = [t1, t2, t3]
Ich möchte überprüfen, ob ein Element in der Liste vorhanden ist T
wo attr1 = 'T2'
.
Prüfen, ob die Liste enthält, ein solches Element, indem Sie:
any(x for x in l if x.attr1 == 'T2')
liefert nur die Information, ob eine solche namedtuple in der Liste enthalten ist oder nicht.
Ich möchte dieses namedtuple auch von der Liste knallen lassen.
Eine Möglichkeit, es zu tun ist:
if any(x for x in l if x.attr1 == 'T2'):
result = [x for x in l if x.attr1 == 'T2'].pop()
Allerdings habe ich diese Lösung nicht gefällt, da ich l
zweimal über die Liste bin Looping.
Gibt es einen besseren/eleganteren Weg dies zu tun?
nicht direkt eine Antwort, aber die üblichen 'any' Ausdruck für die Prüfung der Existenz eines solchen Elements wäre' any (x.attr1 == ' T2 'für x in l) ', nicht was du hast. Was Sie tun, ist, dass Sie sich unbeabsichtigt auf die Tatsache verlassen, dass Ihre benannten Tupel als wahr betrachtet werden, wenn sie als Boolean behandelt werden. In der Tat ist das Genexp, das du geschrieben hast, besser geeignet, um ein passendes Nametuple zu extrahieren als das Existenzen zu testen! – user2357112