it-swarm.com.de

Python: Finden eines Elements in einer Liste

Was ist ein guter Weg, um den Index eines Elements in einer Liste in Python zu finden?
Beachten Sie, dass die Liste möglicherweise nicht sortiert ist.

Gibt es eine Möglichkeit, den zu verwendenden Vergleichsoperator anzugeben?

144

Der beste Weg ist wahrscheinlich die Verwendung der Listenmethode .index .

Für die Objekte in der Liste können Sie Folgendes tun:

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

mit jeder speziellen Verarbeitung, die Sie benötigen.

Sie können auch eine for/in-Anweisung mit enumerate (arr) verwenden.

Beispiel für das Ermitteln des Index eines Elements mit einem Wert> 100.

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

Quelle

50
Brian R. Bondy

Von Tauchen Sie in Python ein :

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

Wenn Sie nur herausfinden möchten, ob ein Element in der Liste enthalten ist oder nicht:

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

Hier ist eine andere Möglichkeit, das Listenverständnis zu nutzen (manche Leute finden es fraglich). Es ist für einfache Tests, z. Vergleiche von Objektattributen (die ich sehr brauche):

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

Dies setzt natürlich die Existenz (und tatsächlich die Eindeutigkeit) eines geeigneten Elements in der Liste voraus.

29
ThomasH

angenommen, Sie möchten einen Wert in einem Numpy-Array finden, dann könnte so etwas funktionieren:

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

Es gibt die Methode index, i = array.index(value), aber ich glaube nicht, dass Sie einen benutzerdefinierten Vergleichsoperator angeben können. Es wäre jedoch nicht schwer, eine eigene Funktion zu schreiben:

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

Ich benutze die Funktion, um den Index für das passende Element zurückzugeben (Python 2.6):

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

Verwenden Sie es dann über die Lambda-Funktion, um das benötigte Element nach einer beliebigen erforderlichen Gleichung abzurufen, z. unter Verwendung des Elementnamens.

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

Wenn ich es an mehreren Stellen in meinem Code verwenden muss, definiere ich einfach eine bestimmte Suchfunktion, z. Um ein Element nach seinem Namen zu finden:

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

Und dann ist es ganz einfach und lesbar:

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

Die Indexmethode einer Liste erledigt dies für Sie. Wenn Sie die Reihenfolge garantieren möchten, sortieren Sie die Liste zuerst mit sorted(). Sorted akzeptiert einen cmp- oder Schlüsselparameter, um festzulegen, wie die Sortierung erfolgen soll:

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

Oder:

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

Dies habe ich durch Anpassung einiger Tutos herausgefunden. Danke an google und an euch alle;)

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

Eine sehr einfache Anwendung:

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

[2, 3]

P.S. Entschuldige mein Englisch

2
Gael

wie ist das hier

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

Verwendungszweck:

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