计算单词而不检查单词是"在"字典

时间:2014-12-06 19:57:20

标签: python dictionary

我知道有些模块可以做这种行为,但我对如何处理以下问题很感兴趣"问题"。

每当我以前想要计算事件时,我发现它有点傻我必须首先检查一个键是否是"在"字典(#1)。我相信当时我甚至尝试过...例外,因为我不知道如何正确地做到这一点。

# 1
words = ['a', 'b', 'c', 'a', 'b']
dicty = {}
for w in words:
    if w in dicty:
        dicty[w] += 1
    else:
        dicty[w] = 1 

此时此刻,我对制作课程需要做些什么感兴趣...#34; SpecialDictionary"表现如果一个单词不在字典中,它会自动获得一个默认的0值(#2)。这个问题需要哪些概念?

注意:我明白这个"在"检查可以在课堂上进行'定义,但必须有更多的pythonic / elegant?

# 2
special_dict = SpecialDictionary()        
for w in words:
    special_dict[w] += 1

4 个答案:

答案 0 :(得分:2)

您需要使用dict.get

>>> my_dict = {}
>>> for x in words:
...     my_dict[x] = my_dict.get(x,0) + 1
... 
>>> my_dict
{'a': 2, 'c': 1, 'b': 2}

dict.get返回密钥的值(如果存在),否则为默认值 语法:dict.get(key,[default])

您也可以使用try和except,如果在词典中找不到键,则会引发keyError

>>> for x in words:
...     try:
...         my_dict[x] += 1
...     except KeyError:
...         my_dict[x] = 1
... 
>>> my_dict
{'a': 2, 'c': 1, 'b': 2}

使用Counter

>>> from collections import Counter
>>> words = ['a', 'b', 'c', 'a', 'b']
>>> my_count = Counter(words)
>>> my_count
Counter({'a': 2, 'b': 2, 'c': 1})

答案 1 :(得分:2)

子类dict并覆盖其__missing__方法以返回0:

class SpecialDictionary(dict):
    def __missing__(self, k):
        return 0

words = ['a', 'b', 'c', 'a', 'b']
special_dict = SpecialDictionary()        
for w in words:
    special_dict[w] += 1
print special_dict
#{'c': 1, 'a': 2, 'b': 2}

答案 2 :(得分:0)

您可以使用defaultdict。或者这是你希望避免的“模块之一”吗?

from collections import defaultdict
d = defaultdict(lambda : 0)
d['a'] += 1
print(d['a'])
print(d['b'])

它将打印:

1
0

答案 3 :(得分:0)

实现这种行为的'SpecialDictionary'是collections.defaultdict。它将一个函数作为第一个参数作为default-value-factory。当执行查找时,它会检查密钥是否已经存在于字典中,如果不是这样,则使用该工厂函数创建一个值,然后将该值添加到字典中(并由查找返回)。请参阅docs了解其实施方式。

Counterdefaultdict的一个特殊变体,它使用int作为工厂函数(并提供了一些额外的方法)