Position in Liste suchen

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
Nordpol
User
Beiträge: 19
Registriert: Sonntag 19. September 2010, 18:21

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.
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“.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Nordpol
User
Beiträge: 19
Registriert: Sonntag 19. September 2010, 18:21

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Nordpol
User
Beiträge: 19
Registriert: Sonntag 19. September 2010, 18:21

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.
Zuletzt geändert von Anonymous am Sonntag 23. Juli 2017, 21:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Nordpol: klar geht das. Ist aber sinnfrei. Betrachte einmal, was denn Deine "Restsyntax" ist.
Nordpol
User
Beiträge: 19
Registriert: Sonntag 19. September 2010, 18:21

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

[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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
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. :-)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ohja, stimmt. Beim Vereinfachen lässt man manchmal Details weg.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten