Seite 1 von 1

Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 16:34
von Nordpol
Hallo Forum,

Code: Alles auswählen

s.count(x)
gibt mir aus, wie oft ein Wert in einer Liste vorkommt.
Ich hätte eigentlich aber gerne die Position in der Liste gehabt, an der x vorkommt, vor allem, wenn x mehrfach vorkommt.

Nicht falsch verstehen, es ist keine Frage, diese durch iterieren heraus zu bekommen, ich hätte eigentlich gerne gewußt, ob die count-Funktion das hergibt oder es eine andere Funktion gibt, die es kann. In der Doku habe ich Beides nciht gesehen.

N.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 16:46
von BlackJack
@Nordpol: Für die erste Position gibt es eine Methode. Wenn Du alle haben möchtest, musst Du das selber schreiben. Ist ein Einzeiler/*ein* Ausdruck mit `enumerate()` und einer „list comprehension“.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 16:47
von noisefloor
Hallo,

`count()` ist in der Tat nur zum Zählen da. Wenn du alle Indexe suchst, dann musst du in der Tat iterieren oder mit der Methode `index()` von Listen und einem Offset arbeiten.

Wenn du bei Google nach "python list find multiple index" suchst, sind die ersten Suchtreffer alles Threads bei StackOverflow, wo diverse Möglichkeiten gezeigt werden.

Gruß, noisefloor

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 17:28
von Nordpol
Hi und danke,

den Ausdruck habe ich gefunden, aber der ist sehr neu für mich:

Code: Alles auswählen

indices = [i for i, x in enumerate(my_list) if x == "whatever"]
Ich verstehe den nur zum Teil, alles nach dem Komma ist mir klar, aber was genau macht "i for i"?

N.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 18:40
von noisefloor
Hallo,

das ist eine List Comprehension, was in Python (und anderen Programmiersprachen auch) eine schnelle und elegante Möglichkeit ist, eine Liste zur erzeugen.

Der folgende "lange" Python Code liefert das gleich Ergebnis:

Code: Alles auswählen

indices = []
for i, x in enumerate(my_list):
    if x == 'whatever':
        indices.append(i)
Gruß, noisefloor

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 19:31
von Nordpol
Hi Noisefloor,

danke für die Hilfe.
Ich glaub, ich habs jetzt; Das erste i bezeichnet das, was in der neuen Liste landet, der Rest ist die ganz normale "Restsyntax" beim iterieren über enumerate().

Heißt, ich könnte vermutlich auch eine verschachtelte Liste erzeugen und sowohl i als auch x hinein legen:

Code: Alles auswählen

indices = [[i,x] for i, x in enumerate(my_list) if x == "whatever"]
Oder?

N.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 19:38
von kbr
@Nordpol: klar geht das. Ist aber sinnfrei. Betrachte einmal, was denn Deine "Restsyntax" ist.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 19:51
von Nordpol
kbr hat geschrieben:@Nordpol: klar geht das. Ist aber sinnfrei. Betrachte einmal, was denn Deine "Restsyntax" ist.
Mir gings nur darum, zu wissen, wofür das i steht.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 20:03
von noisefloor
Hallo,

`enumerate()` liefert zwei Werte zurück, also muss du die Werte zwei Variablen zuweisen. `i` ist hier die Zähler von `enumerate()`. Ob du die Variable `i` nennst oder `pinkes_einhorn` ist Python egal, üblich in Beispielen ist aber eher `i`.

Gruß, noisefloor

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 20:44
von DeaD_EyE
[element for element in iterable condition]
[index for (index, element) in enumerate(my_list) if element == "whatever"][/code]

Wie schon beschrieben, liefert enumerate zwei Werte pro Durchlauf zurück. Das erste Element ist der Zähler, welcher bei 0 anfängt und das zweite Element stammt aus dem Objekt, über das iteriert wird. Den Startwert des Zählers kann man bei enumerate auch festlegen. Da es sich hier um Indizes bezogen auf die Liste handelt, ist es ganz praktisch, dass standardmäßig bei 0 angefangen wird.

Re: Position in Liste suchen

Verfasst: Sonntag 23. Juli 2017, 22:08
von BlackJack
Um mal Korinthen zu kacken: `enumerate()` liefert wie alle Funktionen/aufrufbaren Objekte genau *einen* Wert zurück. Einen Generator. Und auch Dieser liefert pro Schritt immer nur *einen* Wert zurück. Ein Tupel mit zwei Elementen. Das kann man auch an *einen* Namen binden wenn man möchte. Es ist halt in der Regel nur sinnvoller die beiden Elemente auf zwei Namen zu verteilen. :-)

Re: Position in Liste suchen

Verfasst: Montag 24. Juli 2017, 06:26
von noisefloor
Hallo,

@BlackJack: kannste jetzt glaube oder nicht, aber so ähnlich wollte ich das zuerst auch schreiben. Habe mich dann aber im Kontext des Threads für die simplifizierte Variante entschieden. Nächstes Mal werde ich dann auch die präzise Variante wählen ;-)

Gruß, noisefloor

Re: Position in Liste suchen

Verfasst: Montag 24. Juli 2017, 07:23
von DeaD_EyE
Ohja, stimmt. Beim Vereinfachen lässt man manchmal Details weg.