Verallgmeinere Liste.index(dings)

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
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Hallo Gemeinde,

ich bin auf die Frage gestoßen, wie ich in einer Sequenz den Index finde, an dem zum Beispiel x zum 7ten mal auftritt. Ich kann natürlich erstmal die ersten sechs Stellen aufspüren, wo x auftaucht, doch das erscheint mir etwas stumpf. Gibt es bereits eine Funktion, die sowas kann?

Das beste, was mir bislang eingefallen ist, besteht darin, die die ersten sechs x in meiner Liste (besser einem Klon davon) durch ein anderes Zeichen zu ersetzen und danach einfach Sequenz.index('x') zu benutzen. So muss ich mir zwischendurch zumindest nicht merken, wo die ersten sechs x stehen.

Über Kommentare und Anregungen würde ich mich freuen. Danke und Grüße, Tyrax
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, so eine Funktion gibt es nicht, es ist ja auch ganz einfach selbst zu schreiben:

Code: Alles auswählen

def nth_index(iterable, target, n=1):
    for i, e in enumerate(iterable):
        if e == target:
            n -= 1
            if n == 0:
                return i
Den Code robust zu machen gibts als Uebung ;)
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Joa, danke. Bei mir wär's erstmal nicht so schlank und schick geworden. Tyrax
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tyrax hat geschrieben: ich bin auf die Frage gestoßen, wie ich in einer Sequenz den Index finde, an dem zum Beispiel x zum 7ten mal auftritt. Ich kann natürlich erstmal die ersten sechs Stellen aufspüren, wo x auftaucht, doch das erscheint mir etwas stumpf. Gibt es bereits eine Funktion, die sowas kann?
Nee, dazu wäre ja viel Aufwand notwendig - so etwas bietet eine Liste nicht.
Tyrax hat geschrieben: Das beste, was mir bislang eingefallen ist, besteht darin, die die ersten sechs x in meiner Liste (besser einem Klon davon) durch ein anderes Zeichen zu ersetzen und danach einfach Sequenz.index('x') zu benutzen. So muss ich mir zwischendurch zumindest nicht merken, wo die ersten sechs x stehen.
Kapiere ich nicht!

Ich würde mich einfach eine Liste / Dict anlegen, in der ich mir die Indizes der Zeichen merke.

Code: Alles auswählen

In [117]: import string

In [118]: from random import choice

In [119]: data = [choice(string.lowercase) for _ in range(20)]

In [120]: ",".join(data)
Out[120]: 'f,h,j,h,m,s,u,k,y,i,w,p,i,p,i,v,n,y,e,o'

In [121]: from collections import defaultdict

In [122]: indices = defaultdict(list)

In [123]: for index, item in enumerate(data):
   .....:     indices[item].append(index)
   .....:     
   .....:     

In [124]: indices
Out[124]: defaultdict(<type 'list'>, {'e': [18], 'f': [0], 'i': [9, 12, 14], 'h': [1, 3], 'k': [7], 'j': [2], 'm': [4], 'o': [19], 'n': [16], 'p': [11, 13], 's': [5], 'u': [6], 'w': [10], 'v': [15], 'y': [8, 17]})
Im indices-Dict kann man jetzt halt gucken, an welcher Stelle der Ausgangsliste das x. Vorkommen steht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten