Suche Index zum Wert in einer Liste [PHP: array_search()]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Donnerstag 14. Dezember 2006, 09:58

Ich habe eine Liste, in der Werte doppelt auftauchen können. Nun suche ich in der Liste nach einem Begriff und möchte den zugehörigen Index (Position des Wertes) haben. Wenn der Begriff mehrfach auftaucht, möchte ich eine Liste von Indizes haben. Wenn der gesuchte Begriff gar nicht vorkommt, reicht mir eine leere Liste als Antwort.

Muss man sich das selber basteln?

Eine (unsaubere) Idee:

Code: Alles auswählen

a = ["foo", "bar", "foo"]

def ListIndices(l, v):
	tmp = l[:]
	indices = []
	while tmp.count(v) > 0:
		index = tmp.index(v)
		indices.append(index)
		tmp[index] = None
	return indices

print ListIndices(a, "foo") # [0, 2]
print ListIndices(a, "bar") # [1]
print ListIndices(a, None) # []
Damit tmp.count(v) dekrementiert wird, muss ich einen gefundenen Wert irgendwie zerstören. Aus der Liste entfernen kann ich ihn aber nicht (z.B. mit tmp.pop(index)), weil sich sonst die Indizes ändern. Ich muss den Wert an dieser Stelle "zurücksetzen", was ich hier mit tmp[index] = None versuche. Somit könnte ich aber nie nach dem Wert None suchen. Daher ist diese Idee nur sehr bedingt geeignet.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 14. Dezember 2006, 11:12

Ich würde es so machen:

Code: Alles auswählen

a = ["foo", "bar", "foo"]

def ListIndices(l, v):
    indices = []
    for index, item in enumerate(l):
        if item == v:
            indices.append(index)
            
    return indices


print ListIndices(a, "foo") # [0, 2]
print ListIndices(a, "bar") # [1]
print ListIndices(a, None) # []
EDIT: Oder kürzer:

Code: Alles auswählen

a = ["foo", "bar", "foo"]

def ListIndices(l, v):
    return [index for index, item in enumerate(l) if item==v]


print ListIndices(a, "foo") # [0, 2]
print ListIndices(a, "bar") # [1]
print ListIndices(a, None) # []
:lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Donnerstag 14. Dezember 2006, 11:34

Ganz nett! Es gibt immer wieder was zu lernen... danke!
Antworten