我知道有些模块可以做这种行为,但我对如何处理以下问题很感兴趣"问题"。
每当我以前想要计算事件时,我发现它有点傻我必须首先检查一个键是否是"在"字典(#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
答案 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了解其实施方式。
Counter
是defaultdict
的一个特殊变体,它使用int作为工厂函数(并提供了一些额外的方法)