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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.