Forum: PC-Programmierung Python3 Counter


von Stephan S. (uxdx)


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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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

von Stephan S. (uxdx)


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

von Ein T. (ein_typ)


Lesenswert?

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

Verstehe ich nicht. Schreib bitte einmal auf, was Du erhälst, und 
einmal, was Du erwartest. Danke.

von Mario P. (mario_71950c)


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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

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}')

von Stephan S. (uxdx)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.