Zählen der Anzahl der Schlüsselwörter in einem Wörterbuch in Python


234

Ich habe eine Liste von Wörtern in einem Wörterbuch mit dem Wert = die Wiederholung des Schlüsselworts, aber ich möchte nur eine Liste verschiedener Wörter, also wollte ich die Anzahl der Schlüsselwörter zählen. Gibt es eine Möglichkeit, die Anzahl der Schlüsselwörter zu zählen, oder gibt es eine andere Möglichkeit, nach bestimmten Wörtern zu suchen?

Antworten:


410
len(yourdict.keys())

oder nur

len(yourdict)

Wenn Sie eindeutige Wörter in der Datei zählen möchten, können Sie sie einfach verwenden setund mögen

len(set(open(yourdictfile).read().split()))

4
Ich weiß, dass dieser Beitrag alt ist, aber ich war neugierig. Ist das die schnellste Methode? Oder: Ist es eine relativ schnelle Methode für große Wörterbücher?
theJollySin

2
Beide len(yourdict.keys())und len(yourdict)sind O (1). Letzteres ist etwas schneller. Siehe meine Tests unten.
Chih-Hsuan Yen

5
Ich möchte darauf hinweisen, dass Sie auch mitlen(yourdict.values())
ntk4

29

Die Anzahl der unterschiedlichen Wörter (dh die Anzahl der Einträge im Wörterbuch) kann mithilfe der len()Funktion ermittelt werden.

> a = {'foo':42, 'bar':69}
> len(a)
2

Verwenden Sie die .keys()Methode, um alle eindeutigen Wörter (dh die Schlüssel) zu erhalten .

> list(a.keys())
['foo', 'bar']

5

Das len()direkte Aufrufen Ihres Wörterbuchs funktioniert und ist schneller als das Erstellen d.keys()und Aufrufen eines Iterators, len()aber die Geschwindigkeit von beiden ist im Vergleich zu allem, was Ihr Programm sonst noch tut, vernachlässigbar.

d = {x: x**2 for x in range(1000)}

len(d)
# 1000

len(d.keys())
# 1000

%timeit len(d)
# 41.9 ns ± 0.244 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit len(d.keys())
# 83.3 ns ± 0.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

2

Wenn es um das Zählen der Anzahl der Keywords geht, würde ich so etwas empfehlen

def countoccurrences(store, value):
    try:
        store[value] = store[value] + 1
    except KeyError as e:
        store[value] = 1
    return

in der Hauptfunktion haben Sie etwas, das die Daten durchläuft und die Werte an die Funktion countoccurrences übergibt

if __name__ == "__main__":
    store = {}
    list = ('a', 'a', 'b', 'c', 'c')
    for data in list:
        countoccurrences(store, data)
    for k, v in store.iteritems():
        print "Key " + k + " has occurred "  + str(v) + " times"

Der Code wird ausgegeben

Key a has occurred 2 times
Key c has occurred 2 times
Key b has occurred 1 times

2
PEP 8-Namenskonventionen schreiben vor, dass dies countoccurrences()stattdessen sein sollte count_occurrences(). Wenn Sie importieren collections.Counter, gibt es auch einen viel besseren Weg, dies zu tun : from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham

0

Einige Änderungen wurden an der veröffentlichten Antwort UnderWaterKremlin vorgenommen, um sie python3-sicher zu machen. Ein überraschendes Ergebnis unten als Antwort.

Systemspezifikationen:

  • Python = 3.7.4,
  • conda = 4.8.0
  • 3,6 GHz, 8 Kern, 16 GB.
import timeit

d = {x: x**2 for x in range(1000)}
#print (d)
print (len(d))
# 1000

print (len(d.keys()))
# 1000

print (timeit.timeit('len({x: x**2 for x in range(1000)})', number=100000))        # 1

print (timeit.timeit('len({x: x**2 for x in range(1000)}.keys())', number=100000)) # 2

Ergebnis:

1) = 37.0100378

2) = 37.002148899999995

Es scheint also, dass dies len(d.keys())derzeit schneller ist als nur die Verwendung len().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.