die Saiten sind Angenommen bereits gruppiert (alle wiederholten Strings sind konsekutiv), die niedrigste Kopf Weg, dies zu tun, ist mit itertools.groupby
from itertools import groupby
numbers = [i for i, (_, g) in enumerate(groupby(mylist)) for _ in g]
dies nur Gruppen die Einträge in mylist
(list
ist ein schrecklicher Name für eine Variable, Schatten der list
Konstruktor), und produziert i
(die 0-up Anzahl der Gruppen bisher gesehen) einmal für jeden Eintrag in der Gruppe (uns ist es egal, was die Werte sind, so for _ in g
, um die _
ist unwichtig).
Wenn wiederholte Werte könnten nicht-konsekutiven sein, sollte aber die gleiche Gruppennummer haben (das heißt, ['d', 'f', 'd']
auftreten könnte und sollte [0, 1, 0]
produzieren anstatt [0, 1, 2]
), würden Sie einen anderen Ansatz verwenden (die mit auch funktionieren würde der in Folge nur Fall, erfordert jedoch anhaltende und wachsenden Zustand, dass der groupby
Ansatz vermeidet):
from collections import defaultdict
from itertools import count
# If key seen already, returns value, otherwise, returns next unused integer group number
grouptracker = defaultdict(count().__next__) # .next on Py2
numbers = [grouptracker[x] for x in mylist]
Oder einzeilige es für Spaß und Unergründlichkeit (tut dies nicht wirklich tun):
numbers = list(map(defaultdict(count().__next__).__getitem__, mylist))
Könnte nicht Die Liste sieht so aus: '['foo', 'bar', 'foo', 'baz']'? –
Es ist mir nicht klar, was Sie fragen. –
Sie meinen die Ausgabe? Dafür brauche ich die Zahlen wie gezeigt. Ein anderes Beispiel: list = ['d', 'd', 'd', 'r', 'r', 't] müsste lauten: numbers = [0,0,0,1,1,2] –