web-dev-qa-db-fra.com

Python: trouver un élément dans une liste

Quel est un bon moyen de trouver l'index d'un élément dans une liste en Python?
Notez que la liste ne peut pas être triée.

Existe-t-il un moyen de spécifier quel opérateur de comparaison utiliser?

144

La meilleure solution consiste probablement à utiliser list, méthode .index .

Pour les objets de la liste, vous pouvez faire quelque chose comme:

def __eq__(self, other):
    return self.Value == other.Value

avec tout traitement spécial dont vous avez besoin.

Vous pouvez également utiliser une instruction for/in avec enumerate (arr)

Exemple de recherche de l'index d'un élément dont la valeur est> 100.

for index, item in enumerate(arr):
    if item > 100:
        return index, item

Source

50
Brian R. Bondy

De plonger dans Python :

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5
258
Matt Howell

Si vous voulez juste savoir si un élément est contenu ou non dans la liste:

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False
142
Eduardo

Voici un autre moyen d'utiliser la compréhension de liste (certaines personnes pourraient le trouver discutable). Il est très accessible pour des tests simples, par exemple. comparaisons sur les attributs d'objet (ce dont j'ai besoin beaucoup):

el = [x for x in mylist if x.attr == "foo"][0]

Bien entendu, cela suppose l’existence (et, en réalité, le caractère unique) d’un élément approprié dans la liste.

29
ThomasH

en supposant que vous vouliez trouver une valeur dans un tableau numpy, je suppose que quelque chose comme ceci pourrait fonctionner:

Numpy.where(arr=="value")[0]
15
Sebastian Gurovich

Il y a la méthode index, i = array.index(value), mais je ne pense pas que vous puissiez spécifier un opérateur de comparaison personnalisé. Il ne serait pas difficile d'écrire votre propre fonction pour le faire, cependant:

def custom_index(array, compare_function):
    for i, v in enumerate(array):
        if compare_function(v):
            return i
8
David Z

J'utilise la fonction pour renvoyer l'index pour l'élément correspondant (Python 2.6):

def index(l, f):
     return next((i for i in xrange(len(l)) if f(l[i])), None)

Puis utilisez-le via la fonction lambda pour récupérer l’élément nécessaire à l’aide de l’équation requise, par ex. en utilisant le nom de l'élément.

element = mylist[index(mylist, lambda item: item["name"] == "my name")]

Si j'ai besoin de l'utiliser à plusieurs endroits de mon code, je définis simplement une fonction de recherche spécifique, par exemple. pour trouver un élément par son nom:

def find_name(l, name):
     return l[index(l, lambda item: item["name"] == name)]

Et puis c'est assez facile et lisible:

element = find_name(mylist,"my name")
5
jki

La méthode d'index d'une liste le fera pour vous. Si vous souhaitez garantir l'ordre, triez d'abord la liste à l'aide de sorted(). Sorted accepte un paramètre cmp ou key pour dicter le déroulement du tri:

a = [5, 4, 3]
print sorted(a).index(5)

Ou:

a = ['one', 'aardvark', 'a']
print sorted(a, key=len).index('a')
5
Jarret Hardie

J'ai trouvé cela en adaptant des tutos. Merci à Google et à vous tous;)

def findall(L, test):
    i=0
    indices = []
    while(True):
        try:
            # next value in list passing the test
            nextvalue = filter(test, L[i:])[0]

            # add index of this value in the index list,
            # by searching the value in L[i:] 
            indices.append(L.index(nextvalue, i))

            # iterate i, that is the next index from where to search
            i=indices[-1]+1
        #when there is no further "good value", filter returns [],
        # hence there is an out of range exeption
        except IndexError:
            return indices

Une utilisation très simple:

a = [0,0,2,1]
ind = findall(a, lambda x:x>0))

[2, 3]

P.S. Scuse mon anglais

2
Gael

comment va celui-ci?

def global_index(lst, test):
    return ( pair[0] for pair in Zip(range(len(lst)), lst) if test(pair[1]) )

Usage:

>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3)
<generator object <genexpr> at ...>
>>> list(_)
[3, 4, 5]