Zliczanie liczby słów kluczowych w słowniku w Pythonie


234

Mam listę słów w słowniku o wartości = powtórzenie słowa kluczowego, ale chcę tylko listę wyrazistych słów, więc chciałem policzyć liczbę słów kluczowych. Czy istnieje sposób na policzenie liczby słów kluczowych lub jest inny sposób, w jaki powinienem szukać odrębnych słów?

Odpowiedzi:


410
len(yourdict.keys())

Lub tylko

len(yourdict)

Jeśli chcesz policzyć unikalne słowa w pliku, możesz po prostu użyć seti zrobić jak

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

4
Wiem, że ten post jest stary, ale byłem ciekawy. Czy to najszybsza metoda? Albo: czy jest to rozsądnie szybka metoda dla dużych słowników?
theJollySin

2
Zarówno len(yourdict.keys())i len(yourdict)O (1). Ten ostatni jest nieco szybszy. Zobacz moje testy poniżej.
Chih-Hsuan Jen

5
Chciałbym zauważyć, że możesz także przejść do wartości (wiem, że pytanie nie len(yourdict.values())
zadało

29

Liczbę różnych słów (tzn. Liczbę wpisów w słowniku) można znaleźć za pomocą len()funkcji.

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

Aby uzyskać wszystkie odrębne słowa (tj. Klucze), użyj .keys()metody.

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

5

Wywoływanie len()bezpośrednio ze słownika działa i jest szybsze niż budowanie iteratora d.keys()i wywoływanie len()go, ale szybkość jednego z nich będzie nieznaczna w porównaniu z tym, co robi Twój program.

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

Jeśli pytanie dotyczy zliczenia liczby słów kluczowych, poleciłbym coś takiego

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

w głównej funkcji mają coś, co zapętla dane i przekazuje wartości do funkcji countoccrenrences

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"

Kod wyjściowy

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

2
Konwencje nazewnictwa PEP 8 nakazują, countoccurrences()aby tak było count_occurrences(). Ponadto, jeśli import collections.Counter, jest znacznie lepszym sposobem, aby to zrobić: from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham

0

Wprowadzono pewne modyfikacje w opublikowanej odpowiedzi UnderWaterKremlin, aby uczynić ją python3 proof. Zaskakujący wynik poniżej jako odpowiedź.

Specyfikacja systemu:

  • python = 3.7.4,
  • conda = 4.8.0
  • 3,6 Ghz, 8 rdzeni, 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

Wynik:

1) = 37,0100378

2) = 37,002148899999995

Wygląda więc na to, że len(d.keys())obecnie jest szybszy niż zwykłe używanie len().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.