HOWTO · Python

Wie man einzigartige Werte in Python-Liste zählt

Einmalige Werte in Python-Liste zählen

Auf dieser Seite

Eine einfache Möglichkeit, die Anzahl unterschiedlicher Werte in einer Python-Liste zu ermitteln, ist len(set(values)). Das funktioniert, wenn die Elemente der Liste hashbar sind – dazu zählen Zahlen, Zeichenketten und Tupel, deren Elemente alle hashbar sind. Wenn Sie zusätzlich wissen möchten, wie oft jeder Wert vorkommt, liefert collections.Counter in einem Durchlauf sowohl die Anzahl unterschiedlicher Werte als auch die Häufigkeit jedes einzelnen Werts. numpy.unique eignet sich besonders, wenn Ihre Daten bereits in einem NumPy-Array gespeichert sind. Dieser Artikel stellt alle drei Ansätze vor und erklärt, wie Sie zwischen ihnen wählen.

Eindeutige Werte mit set() zählen

Die eingebaute Funktion set() wandelt eine Liste in ein Set um, das jeden unterschiedlichen Wert nur einmal speichert. Wenn Sie das Ergebnis mit len() umschließen, erhalten Sie die Anzahl der eindeutigen Werte, ohne etwas zusätzlich importieren zu müssen.

Führen Sie dieses Beispiel aus. Der Code und die angezeigten Ausgaben bleiben auf Englisch:

values = [1, 2, 2, 3, 4, 4, 5]
unique_values = set(values)

print(len(unique_values))

Ausgabe:

5

set(values) entfernt die Wiederholungen von 2 und 4; anschließend gibt len() die Anzahl der verbleibenden Elemente zurück. Die Elemente der Eingabe müssen hashbar sein – Python meldet einen TypeError, wenn die Liste beispielsweise weitere Listen oder Dictionaries enthält. Beachten Sie auch, dass ein Set die ursprüngliche Reihenfolge der Liste nicht beibehält. Damit lässt sich also beantworten, „wie viele“ Werte es gibt, aber nicht, „welcher zuerst kam“. Wenn Sie die eindeutigen Werte in der Reihenfolge ihres ersten Auftretens benötigen, verwenden Sie stattdessen list(dict.fromkeys(values)). Dessen Länge entspricht derselben Anzahl unterschiedlicher Werte.

Eindeutige Werte mit collections.Counter zählen

collections.Counter ist eine wörterbuchähnliche Klasse, die zählt, wie oft jedes Element in einem Iterable vorkommt. Sie eignet sich, wenn Sie gleichzeitig die Anzahl unterschiedlicher Werte und die Häufigkeit jedes einzelnen Werts ermitteln möchten.

Der Code und die angezeigten Ausgaben bleiben auf Englisch:

from collections import Counter

values = ["apple", "banana", "apple", "orange", "banana", "kiwi"]
counter = Counter(values)

print(len(counter))
print(dict(counter))

Ausgabe:

4
{'apple': 2, 'banana': 2, 'orange': 1, 'kiwi': 1}

counter ordnet jedem Wert seine Häufigkeit zu. Daher zählt len(counter) die unterschiedlichen Schlüssel – in dieser Liste sind es vier. Ein Zugriff per Index, etwa counter["apple"], gibt die Häufigkeit eines einzelnen Werts zurück; counter.most_common(1) liefert das häufigste Element. Wie set() funktioniert auch collections.Counter mit hashbaren Elementen und gehört zur Standardbibliothek.

Eindeutige Werte mit NumPy zählen

NumPy ist ein Paket eines Drittanbieters (Installation mit pip install numpy). Seine Funktion numpy.unique gibt die sortierten eindeutigen Werte einer arrayähnlichen Eingabe zurück. Die Länge dieses Ergebnisses entspricht der Anzahl unterschiedlicher Werte. Mit return_counts=True erhalten Sie außerdem die Häufigkeit jedes Werts.

Der Code und die angezeigten Ausgaben bleiben auf Englisch:

import numpy as np

values = np.array([1, 2, 2, 3, 4, 4, 5])
unique_values, counts = np.unique(values, return_counts=True)

print(len(unique_values))
for value, count in zip(unique_values, counts):
    print(value, count)

Ausgabe:

5
1 1
2 2
3 1
4 2
5 1

unique_values enthält hier die fünf unterschiedlichen Zahlen in sortierter Reihenfolge; counts gibt an, wie oft jede Zahl vorkam – 2 und 4 erscheinen jeweils zweimal. Da numpy.unique das Ergebnis sortiert, eignet sich die Funktion auch, wenn Sie die unterschiedlichen Werte geordnet benötigen. Verwenden Sie diesen Ansatz, wenn Ihre Daten bereits in einem NumPy-Array vorliegen oder Sie ohnehin NumPy einsetzen. Bei einer einfachen Python-Liste vermeiden Sie mit dem Ansatz über set() die zusätzliche Abhängigkeit.

Den passenden Ansatz wählen

Alle drei Ansätze liefern dieselbe Anzahl unterschiedlicher Werte. Wählen Sie daher den Ansatz, der zu Ihrer Eingabe und zu den zusätzlichen Informationen passt, die Sie benötigen:

  • Verwenden Sie set(), wenn Sie nur die Anzahl unterschiedlicher, hashbarer Elemente benötigen und eine möglichst kurze Lösung ohne zusätzliche Abhängigkeiten wünschen.
  • Verwenden Sie collections.Counter, wenn Sie zusätzlich die Häufigkeit jedes Werts, die häufigsten Elemente oder andere Zählungen pro Wert benötigen.
  • Verwenden Sie numpy.unique, wenn Ihre Daten bereits in einem NumPy-Array vorliegen oder Sie sortierte eindeutige Werte benötigen. Mit return_counts=True erhalten Sie auch die Häufigkeiten.

Entscheidend ist also, welche zusätzlichen Informationen Sie benötigen – Häufigkeiten, eine sortierte Ausgabe oder den Verzicht auf eine zusätzliche Abhängigkeit. Die Anzahl selbst liefern alle drei Ansätze auf dieselbe Weise.