Seite 1 von 1

Verallgmeinere Liste.index(dings)

Verfasst: Sonntag 27. Februar 2011, 17:59
von Tyrax
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

Re: Verallgmeinere Liste.index(dings)

Verfasst: Sonntag 27. Februar 2011, 18:09
von cofi
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 ;)

Re: Verallgmeinere Liste.index(dings)

Verfasst: Sonntag 27. Februar 2011, 18:13
von Tyrax
Joa, danke. Bei mir wär's erstmal nicht so schlank und schick geworden. Tyrax

Re: Verallgmeinere Liste.index(dings)

Verfasst: Sonntag 27. Februar 2011, 18:16
von Hyperion
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.