sentence = "The quick brown fox jumped over the lazy dog." characters = {} for character in sentence: characters[character] = characters.get(character, 0) + 1 print(characters)
我不明白 characters.get(character, 0) + 1在做什么,其余的似乎都很简单。
characters.get(character, 0) + 1
从这里开始
然后这里 http://docs.python.org/library/stdtypes.html#mapping-types-dict
然后这里 http://docs.python.org/library/stdtypes.html#dict.get
characters.get( key, default ) key is a character default is 0
如果字符在 dictionary characters中,就会得到 dictionary 对象。
characters
如果没有,你得到0。
句法:
get(key[, default]) 如果 key 在字典中,则返回 key 的值,否则为默认值。如果默认值不给定,则默认值为 None,因此此方法永远不会引发 KeyError。
get(key[, default])
如果 key 在字典中,则返回 key 的值,否则为默认值。如果默认值不给定,则默认值为 None,因此此方法永远不会引发 KeyError。
None
KeyError
除了如果键丢失,它不会引发一个 KeyError,而是返回一个默认值(如果你只用一个参数调用 .get,键,默认值是 None)之外,dict 的 get方法(例如 characters)的工作原理就像为 dict 建立索引一样。
.get
get
因此,一个等价的 Python 函数(其中调用 myget(d, k, v)就像调用 d.get(k, v)一样)可能是:
myget(d, k, v)
d.get(k, v)
def myget(d, k, v=None): try: return d[k] except KeyError: return v
你的问题中的示例代码显然试图计算每个字符的出现次数: 如果它已经有一个给定字符的出现次数,get返回它(所以它只是增加了一次) ,否则 get返回0(所以正确的增加会在字符串中的第一次出现时给出 1)。
1
如果 d 是一个字典,那么 d.get(k, v)的意思是,给我 d 中 k 的值,除非 k 不存在,在这种情况下,给我 v,它在这里被用来得到字符的当前计数,如果以前没有遇到过这个字符,它应该从0开始。
为了理解正在发生的事情,让我们在 判刑字符串中取一个字母(重复多次) ,并跟踪它在循环中发生的情况。
请记住,我们从一个空的 角色字典开始
characters = {}
我会选择字母‘ e’。让我们首次通过循环传递字符‘ e’(在单词 那个中找到)。我会假设它是循环中的第一个字符,然后用它们的值替换变量:
for 'e' in "The quick brown fox jumped over the lazy dog.": {}['e'] = {}.get('e', 0) + 1
Get (‘ e’,0) 告诉 python 在字典中查找关键字‘ e’。如果没有找到,则返回0。因为这是第一次通过循环传递‘ e’,所以字符‘ e’在字典中还没有找到,所以 走开方法返回0。然后将这个0值添加到 1(出现在字符[ role ] = properties s.get (字符,0) + 1方程中)。 在使用‘ e’字符完成第一个循环之后,我们现在在字典中有了这样一个条目: {‘ e’: 1}
现在的词典是:
characters = {'e': 1}
现在,让我们通过相同的循环传递第二个‘ e’(在单词跳转中找到)。我假设这是循环中的第二个字符,然后用它们的新值更新变量:
for 'e' in "The quick brown fox jumped over the lazy dog.": {'e': 1}['e'] = {'e': 1}.get('e', 0) + 1
在这里,走开方法找到‘ e’的一个键条目,并找到它的值1。 我们将它添加到其他 1中,得到的结果是2。
当我们在字符[字符] = 字符. get (字符,0) + 1方程中应用这个函数时:
characters['e'] = 2
应该清楚的是,最后一个方程为已经存在的‘ e’键赋予了一个新的值2。 因此,现在的词典是:
characters = {'e': 2}
我知道这是一个相当古老的问题,但是这看起来像是那种在没有语言特性知识的情况下编写的东西。collections库的存在就是为了实现这些目的。
collections
from collections import Counter letter_counter = Counter() for letter in 'The quick brown fox jumps over the lazy dog': letter_counter[letter] += 1 >>> letter_counter Counter({' ': 8, 'o': 4, 'e': 3, 'h': 2, 'r': 2, 'u': 2, 'T': 1, 'a': 1, 'c': 1, 'b': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'k': 1, 'j': 1, 'm': 1, 'l': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1})
在这个例子中,显然要计算空格,但是是否要过滤这些空格取决于您自己。
至于 dict.get(a_key, default_value),对于这个特定的问题有几个答案——这个方法返回键的值,或者您提供的 default _ value。第一个参数是您要查找的键,第二个参数是该键不存在时的默认参数。
dict.get(a_key, default_value)