it-swarm.com.de

Wie finde ich alle Vorkommen eines Elements in einer Liste?

index() gibt nur das erste Vorkommen eines Elements in einer Liste aus. Gibt es einen ordentlichen Trick, der alle Indizes in einer Liste zurückgibt?

260
Bruce

Sie können ein Listenverständnis verwenden:

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

Zwar keine direkte Lösung für Listen, glänzt numpy wirklich für diese Art von Dingen:

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]

kehrt zurück:

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

Dies kann bei Listen (Arrays) mit einer großen Anzahl von Elementen gegenüber einigen anderen Lösungen erheblich schneller sein.

89
JoshAdel

Eine Lösung mit 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)

Es ist viel schneller als das Listenverständnis mit enumerate für große Listen. Es ist auch viel langsamer als die numpy-Lösung , wenn Sie bereits über das Array verfügen. Andernfalls überwiegen die Konvertierungskosten die Geschwindigkeitszunahme (getestet an ganzzahligen Listen mit 100, 1000 und 10000 Elementen).

HINWEIS: Ein Hinweis zur Vorsicht basierend auf dem Kommentar von Chris_Rands: Diese Lösung ist schneller als das Listenverständnis, wenn die Ergebnisse ausreichend dünn sind, die Liste jedoch viele Instanzen des gesuchten Elements enthält (mehr als ~ 15) % der Liste (bei einem Test mit einer Liste von 1000 ganzen Zahlen) ist das Listenverständnis schneller.

27
Paulo Almeida

Wie wäre es mit:

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

Eine weitere Lösung (sorry wenn Duplikate) für alle Vorkommen:

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

Verwendung von filter () in Python.

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

more_itertools.locate findet Indizes für alle Elemente, die eine Bedingung erfüllen. 

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 ist eine Drittanbieter-Bibliothek > pip install more_itertools.

2
pylang

Oder benutze range (Python 3):

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

Für (Python 2):

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

Und dann (beide Fälle):

print(l)

Ist wie erwartet.

1
U9-Forward

Sie können ein Defaultdict erstellen

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

Abrufen aller Vorkommen und der Position eines oder mehrerer (identischer) Elemente in einer Liste

Mit Aufzählung (Alist) können Sie das erste Element (n) speichern, das der Index der Liste ist, wenn das Element x dem entspricht, wonach Sie suchen.

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

Lassen Sie uns unsere Funktion findindex machen

Diese Funktion übernimmt das Element und die Liste als Argumente und gibt die Position des Elements in der Liste zurück, wie wir es zuvor gesehen haben.

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"))

Ausgabe


[1, 3, 5, 7]

Einfach

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

Ausgabe:

0
4
0
Giovanni Gianni

Wenn Sie nach allen Elementpositionen zwischen bestimmten Indizes suchen müssen, können Sie sie angeben:

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

Wenn Sie Python 2 verwenden, können Sie damit die gleiche Funktionalität erreichen:

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

Dabei ist my_list die Liste, von der Sie die Indizes abrufen möchten, und value der gesuchte Wert. Verwendungszweck:

f(some_list, some_element)