在学习Python时,我遇到了一行代码,可以计算出字母的数量。
dummy='lorem ipsum dolor emet...'
letternum={}
for each_letter in dummy:
letternum[each_letter.lower()]=letternum.get(each_letter,0)+1
print(letternum)
现在,我的问题是 - 在
letternum.get(each_letter,0)+1
的第 4 行代码中,为什么有 ,0)+1
以及为什么使用它。请描述一下。
字典上的
get
方法记录在此处:https://docs.python.org/3/library/stdtypes.html#dict.get
获取(键[,默认])
如果 key 在字典中,则返回 key 的值,否则返回默认值。如果未给出默认值,则默认为 None,因此该方法永远不会引发 KeyError。
所以这解释了
0
- 这是当 letternum
不包含给定字母时使用的默认值。
所以我们有
letternum.get(each_letter, 0)
- 这个表达式查找存储在 letternum
字典中当前考虑的字母的值。如果没有存储值,则计算结果为 0。
然后我们给这个数字加一:
letternum.get(each_letter, 0) + 1
最后我们将其存储回
letternum
字典中,尽管这次将字母转换为小写: letternum[each_letter.lower()] = letternum.get(each_letter, 0) + 1
看来这可能是一个错误。我们可能想要更新我们刚刚查找的同一项目,但如果 each_letter
是大写,那就不是真的。
letternum
是dict
(字典)。 它有一个名为 get
的方法,它返回与给定键关联的值。 如果字典中不存在该键,它将返回一个默认值,即 None
,除非存在可选的第二个参数,在这种情况下,将为缺失的元素返回该参数值。
在这种情况下,如果
letternum.get(each_letter,0)
在字典中,则 letternum[each_letter]
返回 each_letter
。 否则返回 0
。 然后代码将该值加 1 并将结果存储在 letternum[each_letter.lower()]
中。
这会创建每个字母出现次数的计数,但它在更新时不一致地将字母转换为小写,但在检索现有值时则不然,因此它无法正确处理大写字母。
根据https://www.tutorialspoint.com/python/dictionary_get.htm中的文档,字典的get方法的第二个参数是一个可选参数,它指定当key为key时要输出的默认值字典里没有。例如:
letternum = {'keyone':1,'keytwo':2}
print(letternum.get('keythree',3))
print(letternum.get('keyone',3))
会输出
3
,然后输出 1
,因为字典中不存在 key Three,因此它会在第一个打印语句中输出 3
,然后在第二个打印语句中输出 1
,因为键存在。
.get() 简化了缺少对象属性的情况。 get() 用于返回默认的零值,而不是在 letternum 中调用缺失属性时处理 None 和异常处理。
在你的程序中,如果键
each_letter
不在
letternum
中,get方法将返回0,然后加1进行计数。
each_letter
中找不到
letternum
,则将
each_letter: 0
插入到
letternum
中。否则,将插入
letternum[each_letter.lower()] +1
中的值。
collections.Counter()
更适合这个。