Contando el número de palabras clave en un diccionario en Python

234

Tengo una lista de palabras en un diccionario con el valor = la repetición de la palabra clave, pero solo quiero una lista de palabras distintas, así que quería contar la cantidad de palabras clave. ¿Hay alguna forma de contar la cantidad de palabras clave o hay otra forma en que debería buscar palabras distintas?

Dan
fuente

Respuestas:

410
len(yourdict.keys())

o solo

len(yourdict)

Si desea contar palabras únicas en el archivo, puede usar sety hacer me gusta

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

fuente
44
Sé que esta publicación es antigua, pero tenía curiosidad. ¿Es este el método más rápido? O: ¿es un método razonablemente rápido para diccionarios grandes?
theJollySin
2
Ambos len(yourdict.keys())y len(yourdict)son O (1). Este último es un poco más rápido. Ver mis pruebas a continuación.
Chih-Hsuan Yen
55
Me gustaría señalar que también puede len(yourdict.values())
elegir
29

El número de palabras distintas (es decir, el recuento de entradas en el diccionario) se puede encontrar utilizando la len()función.

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

Para obtener todas las palabras distintas (es decir, las claves), utilice el .keys()método

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

Llamar len()directamente a su diccionario funciona, y es más rápido que construir un iterador, d.keys()y recurrir len()a él, pero la velocidad de ambos será insignificante en comparación con cualquier otra cosa que esté haciendo su programa.

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)
Bajo el agua
fuente
2

Si la pregunta es sobre contar el número de palabras clave, entonces recomendaría algo como

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

en la función principal tiene algo que recorre los datos y pasa los valores a la función de contracurrencias

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"

El código sale

Key a has occurred 2 times
Key c has occurred 2 times
Key b has occurred 1 times
David
fuente
2
Las convenciones de nomenclatura PEP 8 dictan que countoccurrences(), en cambio, debería ser así count_occurrences(). También, si importa collections.Counter, hay una mejor manera mucho hacerlo: from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham el
0

Se realizaron algunas modificaciones en la respuesta publicada UnderWaterKremlin para que sea una prueba de python3. Un sorprendente resultado a continuación como respuesta.

Especificaciones del sistema:

  • python = 3.7.4,
  • conda = 4.8.0
  • 3.6Ghz, 8 núcleos, 16gb.
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

Resultado:

1) = 37.0100378

2) = 37.002148899999995

Entonces parece que len(d.keys())actualmente es más rápido que solo usarlo len().

ZF007
fuente