j'ai une liste de tuples nommé:Python: Vérifiez si la liste des tuples nommés contient une valeur d'attribut particulier
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]
Je veux vérifier si un élément existe dans la liste T
où attr1 = 'T2'
.
Vérification si la liste contient un tel élément en faisant:
any(x for x in l if x.attr1 == 'T2')
renvoie uniquement les informations si un tel namedtuple est dans la liste ou non.
Je voudrais également sortir ce namedtuple de la liste.
Une façon de le faire est:
if any(x for x in l if x.attr1 == 'T2'):
result = [x for x in l if x.attr1 == 'T2'].pop()
Cependant, je n'aime pas cette solution, puisque je suis en boucle sur la liste l
deux fois.
Existe-t-il une façon de faire plus élégante?
Pas directement une réponse, mais l'habituel 'any' expression pour tester l'existence d'un tel élément serait' tout (x.attr1 == ' T2 'pour x en l) ', pas ce que vous avez. Ce que vous faites repose involontairement sur le fait que vos namedtuples sont considérés comme vrais lorsqu'ils sont traités comme des booléens. En fait, le genexp que vous avez écrit est plus approprié pour extraire un namedtuple correspondant que pour tester l'existence! – user2357112