338 votes

Trouver un objet dans la liste dont l'attribut est égal à une certaine valeur (qui répond à une condition quelconque).

J'ai une liste d'objets. Je veux trouver un (premier ou autre) objet dans cette liste qui a un attribut (ou un résultat de méthode - autre) égal à value .

Quel est le meilleur moyen de le trouver ?

Voici un cas d'essai :

class Test:
    def __init__(self, value):
        self.value = value

import random

value = 5

test_list = [Test(random.randint(0,100)) for x in range(1000)]

# that I would do in Pascal, I don't believe it's anywhere near 'Pythonic'
for x in test_list:
    if x.value == value:
        print "i found it!"
        break

Je pense que l'utilisation de générateurs et reduce() ne fera aucune différence, car il s'agira toujours d'itérer dans la liste.

ps. : Equation pour value n'est qu'un exemple. Bien sûr, nous voulons obtenir un élément qui répond à n'importe quelle condition.

2voto

tm- Points 293

Vous pouvez également mettre en œuvre la comparaison riche via __eq__ pour votre Test et utiliser in opérateur. Je ne suis pas sûr que ce soit le meilleur moyen autonome, mais au cas où vous auriez besoin de comparer Test sur la base de value quelque part ailleurs, cela pourrait être utile.

class Test:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        """To implement 'in' operator"""
        # Comparing with int (assuming "value" is int)
        if isinstance(other, int):
            return self.value == other
        # Comparing with another Test object
        elif isinstance(other, Test):
            return self.value == other.value

import random

value = 5

test_list = [Test(random.randint(0,100)) for x in range(1000)]

if value in test_list:
    print "i found it"

1voto

user1578297 Points 21

Je viens de rencontrer un problème similaire et j'ai conçu une petite optimisation pour le cas où aucun objet de la liste ne répond à l'exigence (pour mon cas d'utilisation, cela a entraîné une amélioration majeure des performances) :

Avec la liste test_list, je garde un ensemble supplémentaire test_value_set qui consiste en valeurs de la liste sur lesquelles je dois filtrer. C'est donc ici que l'autre partie de la solution d'agf devient très rapide.

0voto

edW Points 27

Pour le code ci-dessous, xGen est une expression de générateur autonome, yFilt est un objet filtre. Notez que pour xGen, le paramètre supplémentaire None est renvoyé plutôt que de lancer StopIteration lorsque la liste est épuisée.

arr =((10,0), (11,1), (12,2), (13,2), (14,3))

value = 2
xGen = (x for x in arr if x[1] == value)
yFilt = filter(lambda x: x[1] == value, arr)
print(type(xGen))
print(type(yFilt))

for i in range(1,4):
    print('xGen: pass=',i,' result=',next(xGen,None))
    print('yFilt: pass=',i,' result=',next(yFilt))

Sortie :

<class 'generator'>
<class 'filter'>
xGen: pass= 1  result= (12, 2)
yFilt: pass= 1  result= (12, 2)
xGen: pass= 2  result= (13, 2)
yFilt: pass= 2  result= (13, 2)
xGen: pass= 3  result= None
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    print('yFilt: pass=',i,' result=',next(yFilt))
StopIteration

0voto

Onur Dikmen Points 31

Si vous cherchez un objet dans un tableau en Python. Vous pouvez utiliser la conditionnelle if.

 model_t1 = [0,1,2,3,4]
 model_t2 = [7,8,9,15,14]
 _data = model_t1

 for md in model_t2:
     _data.append(md)

 for p_data in _data:
     if len(p_data['Property']) == 'Value':
        print(json(p_data))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X