Contando o número de palavras-chave em um dicionário em python


234

Eu tenho uma lista de palavras em um dicionário com o valor = a repetição da palavra-chave, mas eu só quero uma lista de palavras distintas, então eu queria contar o número de palavras-chave. Existe uma maneira de contar o número de palavras-chave ou existe outra maneira de procurar palavras distintas?

Respostas:


410
len(yourdict.keys())

ou apenas

len(yourdict)

Se você gosta de contar palavras únicas no arquivo, basta usar sete fazer o seguinte

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

4
Eu sei que este post é antigo, mas fiquei curioso. Esse é o método mais rápido? Ou: é um método razoavelmente rápido para dicionários grandes?
precisa saber é o seguinte

2
Ambos len(yourdict.keys())e len(yourdict)são O (1). O último é um pouco mais rápido. Veja meus testes abaixo.
Chih-Hsuan Yen

5
Eu gostaria de nota que você também pode ir para os valores (eu sei que a questão não pedi-lo) comlen(yourdict.values())
ntk4

29

O número de palavras distintas (ou seja, contagem de entradas no dicionário) pode ser encontrado usando a len()função

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

Para obter todas as palavras distintas (ou seja, as teclas), use o .keys()método

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

5

A chamada len()direta no seu dicionário funciona e é mais rápida do que a criação de um iterador d.keys()e a chamada len(), mas a velocidade de qualquer uma delas será insignificante em comparação com o que o seu programa estiver fazendo.

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 a pergunta é sobre a contagem do número de palavras-chave, recomendamos algo como

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

na função principal tem algo que percorre os dados e passa os valores para a função 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"

O código gera

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

2
As convenções de nomenclatura do PEP 8 determinam que countoccurrences()deveria ser count_occurrences(). Além disso, se você importar collections.Counter, há uma maneira muito melhor de fazê-lo: from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham

0

Algumas modificações foram feitas na resposta postada UnderWaterKremlin para torná-lo à prova de python3. Um resultado surpreendente abaixo como resposta.

Especificações do 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

Parece que len(d.keys())atualmente é mais rápido do que apenas usar len().

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.