2016-06-21 6 views
0

diese Liste von Strings Gegeben:Python konvertiert Strings in einer Liste zu ganzen Zahlen Basierend auf Bestellung

list=['foo','foo','foo','bar','bar','baz','baz','baz'] 

Ich mag eine Liste der entsprechenden Zahlen erhalten, als ob dies wie dies mit gebundenen Reihen ein Index war :

numbers=[0,0,0,1,1,2,2,2] 

Vielen Dank im Voraus!

+0

Könnte nicht Die Liste sieht so aus: '['foo', 'bar', 'foo', 'baz']'? –

+0

Es ist mir nicht klar, was Sie fragen. –

+0

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] –

Antwort

1

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)) 
+1

Zur Klärung der "Zustandskosten" wird für den Ansatz "groupby" der Speicher, der darüber hinaus benötigt wird, der notwendigerweise für "numbers" und "mylist" verwendet wird, festgelegt; "Meine Liste" könnte ein Element oder 10 Millionen Elemente und eine Gruppe oder 10 Millionen Gruppen enthalten, und der Speicher, der über das für "Meine Liste" und "Zahlen" verwendete hinaus benötigt wird, würde sich nicht ändern. Die "defaultdict" -Lösung würde dagegen zusätzlichen Speicher erfordern, der proportional zur Anzahl der eindeutigen Gruppen in "mylist" ist. – ShadowRanger

Verwandte Themen