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?
Vous pouvez utiliser une compréhension de liste:
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
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.
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 numpy
si 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.
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]
occurrences = lambda s, lst: (i for i,e in enumerate(lst) if e == s)
list(occurrences(1, [1,2,3,1])) # = [0, 3]
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)
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]
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
.
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.
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)
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]
>>>
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]
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
Sortie:
0
4
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]
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)))
Où my_list
est la liste dont vous voulez obtenir les index et value
est la valeur recherchée. Usage:
f(some_list, some_element)