Python3 Counter

OP #7584867
Lesenswert?

Ich brauch mal eine kurze Nachhilfe in Python:

Ich habe eine Liste, da möchte ich zählen, wie oft ein Wert vorkommt, dafür gibt es Counter, das habe ich kapiert

1
from collections import Counter
2
liste = [31, 55, 1, 78, 31, 2, 77, 31, 55]
3
liste = Counter(liste)
4
print(liste)

Das Ergebnis sieht so aus, die häufigste ist zuerst, passt (die Werte müssen nicht sortiert sein, nur die Häufigkeiten)

1
Counter({31: 3, 55: 2, 1: 1, 78: 1, 2: 1, 77: 1})

Wie kann ich nun die Elemente von Counter ausgeben, z.B. so formatiert

1
3 31
2
2 55
3
1  1
4
1 78
5
1  2
6
1 77
OP #7584887
Lesenswert?

Das klappt mit meinem o.g. Beispiel, bringt aber die Sortierung durcheinander. Anderes Beispiel:

1
from collections import Counter
2
liste = ['y', 'f', 'hh', 'g', 'a', 'g', 'y', 'z']
3
liste = Counter(liste)
4
print(liste)
5
for k, v in liste.items():
6
  print(f'{v:3d} {k:3s}')

ergibt

1
Counter({'y': 2, 'g': 2, 'f': 1, 'hh': 1, 'a': 1, 'z': 1})                   
2
  2 y                                                                        
3
  1 f                                                                        
4
  1 hh                                                                       
5
  2 g                                                                        
6
  1 a                                                                        
7
  1 z

Die Liste ist noch ok wenn ich sie als Liste ausgebe (1. Zeile des Ergebnisses), durch items() gerät sie drucheinander

#7584903
Lesenswert?

die durch

1
liste = Counter(liste)

erstellte Liste ist nicht nach Häufigkeit sortiert. Die Elemente erscheinen in der Reihenfolge, in der sie in der Ursprungsliste das erste Mal auftauchen.

mit

1
for k, v in liste.items():
2
  print(f'{v:3d} {k:3s}')

erhälst Du die Reihenfolge, wie sie in der Liste vorliegt.

mit

1
print(liste)

wird die Liste bei der Ausgabe durch die print-Funktion nach Häufigkeit sortiert

Um in beiden Fällen die identische Reihenfolge zu erhalten wirst Du die Liste nach der Häufigkeit sortieren müssen und zwar mit dem selben Sortieralgorithmus, den auch die print-Funktion nutzt. Bei Verwendung eines anderen Algorithmus kann die Reihenfolge der Elemente mit gleicher Häufigkeit unterschiedlich sein.

OP #7584971
Lesenswert?

Yalu X. schrieb:

Stephan S. schrieb:

Das klappt mit meinem o.g. Beispiel, bringt aber die Sortierung durcheinander.

Ersetze items() durch most_common():

1
> for k,v in liste.most_common():
2
>   print(f'{v} {k:2d}')
3
>

PERFEKT, DANKE ! Das war's was ich wollte, geht auch ratz-fatz mit mit meinen echten Daten, das sind fast 4 Millionen Daten mit knapp 170.000 verschiedenen Werten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren