web-dev-qa-db-fra.com

Comment trouver toutes les occurrences d'un élément dans une liste?

index() donnera simplement la première occurrence d'un élément dans une liste. Existe-t-il une astuce qui renvoie tous les index d'une liste?

260
Bruce

Vous pouvez utiliser une compréhension de liste:

indices = [i for i, x in enumerate(my_list) if x == "whatever"]
379
Sven Marnach

Bien que ce ne soit pas une solution pour les listes directement, numpy brille vraiment pour ce genre de chose:

import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]

résultats:

ii ==>array([2, 8])

Cela peut être considérablement plus rapide pour les listes (tableaux) comportant un grand nombre d'éléments par rapport à certaines des autres solutions.

89
JoshAdel

Une solution utilisant list.index:

def indices(lst, element):
    result = []
    offset = -1
    while True:
        try:
            offset = lst.index(element, offset+1)
        except ValueError:
            return result
        result.append(offset)

C'est beaucoup plus rapide que la compréhension de liste avec enumerate, pour les grandes listes. Il est également beaucoup plus lent que la solution numpysi vous avez déjà le tableau, sinon le coût de la conversion est supérieur au gain en vitesse (testé sur des listes d'entiers avec 100, 1000 et 10 000 éléments).

NOTE: Une mise en garde basée sur le commentaire de Chris_Rands: cette solution est plus rapide que la compréhension de la liste si les résultats sont suffisamment clairsemés, mais si la liste contient plusieurs occurrences de l'élément recherché (plus de ~ 15 % de la liste, sur un test avec une liste de 1000 entiers), la compréhension de la liste est plus rapide.

27
Paulo Almeida

Que diriez-vous:

In [1]: l=[1,2,3,4,3,2,5,6,7]

In [2]: [i for i,val in enumerate(l) if val==3]
Out[2]: [2, 4]
13
NPE
occurrences = lambda s, lst: (i for i,e in enumerate(lst) if e == s)
list(occurrences(1, [1,2,3,1])) # = [0, 3]
5
phihag

Une autre solution (désolé si des doublons) pour toutes les occurrences:

values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)
3
Artsiom Rudzenka

Utilisation de filter () dans python2.

>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
2

more_itertools.locate trouve des index pour tous les éléments qui remplissent une condition. 

from more_itertools import locate


list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]

list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]

more_itertools est une bibliothèque tierce > pip install more_itertools.

2
pylang

Ou utilisez range (python 3):

l=[i for i in range(len(lst)) if lst[i]=='something...']

Pour (Python 2):

l=[i for i in xrange(len(lst)) if lst[i]=='something...']

Et puis (les deux cas):

print(l)

Est comme prévu.

1
U9-Forward

Vous pouvez créer un defaultdict

from collections import defaultdict
d1 = defaultdict(int)      # defaults to 0 values for keys
unq = set(lst1)              # lst1 = [1, 2, 2, 3, 4, 1, 2, 7]
for each in unq:
      d1[each] = lst1.count(each)
else:
      print(d1)
0
privatevoid

Obtenir toutes les occurrences et la position d'un ou plusieurs éléments (identiques) dans une liste

Enumerate (alist) vous permet de stocker le premier élément (n) qui est l’index de la liste lorsque l’élément x est égal à ce que vous recherchez.

>>> alist = ['foo', 'spam', 'Egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>

Faisons notre fonction findindex

Cette fonction prend comme arguments l'argument et la liste et renvoie la position de l'élément dans la liste, comme nous l'avons vu auparavant.

def indexlist(item2find, list_or_string):
  "Returns all indexes of an item in a list or a string"
  return [n for n,item in enumerate(list_or_string) if item==item2find]

print(indexlist("1", "010101010"))

Sortie


[1, 3, 5, 7]

Simple

for n, i in enumerate([1, 2, 3, 4, 1]):
    if i == 1:
        print(n)

Sortie:

0
4
0
Giovanni Gianni

Si vous devez rechercher toutes les positions d'élément entre certains index , vous pouvez les indiquer:

[i for i,x in enumerate([1,2,3,2]) if x==2 & 2<= i <=3] # -> [3]
0
Denis Rasulev

Si vous utilisez Python 2, vous pouvez obtenir les mêmes fonctionnalités avec ceci:

f = lambda my_list, value:filter(lambda x: my_list[x] == value, range(len(my_list)))

my_list est la liste dont vous voulez obtenir les index et value est la valeur recherchée. Usage:

f(some_list, some_element)