Conteggio del numero di parole chiave in un dizionario in Python


234

Ho un elenco di parole in un dizionario con il valore = la ripetizione della parola chiave, ma voglio solo un elenco di parole distinte, quindi ho voluto contare il numero di parole chiave. C'è un modo per contare il numero di parole chiave o c'è un altro modo in cui dovrei cercare parole distinte?

Risposte:


410
len(yourdict.keys())

o solo

len(yourdict)

Se ti piace contare parole uniche nel file, puoi semplicemente usare sete fare come

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

4
So che questo post è vecchio, ma ero curioso. È questo il metodo più veloce? Oppure: è un metodo ragionevolmente veloce per dizionari di grandi dimensioni?
theJollySin

2
Entrambi len(yourdict.keys())e len(yourdict)sono O (1). Quest'ultimo è leggermente più veloce. Vedi i miei test di seguito.
Chih-Hsuan Yen,

5
Vorrei sottolineare che puoi anche scegliere i valori (so che la domanda non è stata posta) conlen(yourdict.values())
ntk4

29

Il numero di parole distinte (ovvero il conteggio delle voci nel dizionario) può essere trovato usando la len()funzione.

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

Per ottenere tutte le parole distinte (cioè i tasti), utilizzare il .keys()metodo

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

5

Chiamare len()direttamente sul tuo dizionario funziona ed è più veloce della creazione di un iteratore d.keys()e chiamarlo len(), ma la velocità di entrambi sarà trascurabile rispetto a qualsiasi altra cosa stia facendo il tuo programma.

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

Se la domanda riguarda il conteggio del numero di parole chiave, consiglierei qualcosa di simile

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

nella funzione principale hanno qualcosa che scorre attraverso i dati e passa i valori alla funzione countoccurrences

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"

Il codice viene generato

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

2
Le convenzioni di denominazione PEP 8 impongono che countoccurrences()dovrebbero essere invece count_occurrences(). Inoltre, se si importa collections.Counter, c'è un modo molto migliore per farlo: from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham,

0

Sono state apportate alcune modifiche alla risposta postata UnderWaterKremlin per renderlo a prova di python3. Un risultato sorprendente sotto come risposta.

Specifiche di sistema:

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

Risultato:

1) = 37.0100378

2) = 37.002148899999995

Quindi sembra che len(d.keys())attualmente sia più veloce del semplice utilizzo len().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.