了解Python中的.get()方法

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在做什么,rest似乎很简单。

字典的get方法(就像索引字典一样工作,除了如果key丢失,而不是引发KeyError它将返回默认值(如果只用一个参数调用.get ,默认值是None )。

所以一个等效的Python函数(调用myget(d, k, v)就像d.get(k, v)可能是:

 def myget(d, k, v=None): try: return d[k] except KeyError: return v 

Q中的示例代码显然是试图计算每个字符出现的次数:如果它已经有一个给定字符的计数, get返回它(所以它只是递增1),否则返回0(所以递增在string的第一个出现处正确地给出1 )。

为了理解正在发生的事情,让我们在句子string中取一个字母(重复多次),然后跟随它在循环中发生的情况。

请记住,我们从一个空的字符字典开始

 characters = {} 

我会select字母'e'。 让我们通过循环首次传递字符“e”(在“ The ”中find)。 我会认为这是通过循环的第一个字符,我将用它们的值replacevariables:

 for 'e' in "The quick brown fox jumped over the lazy dog.": {}['e'] = {}.get('e', 0) + 1 

characters.get('e',0)告诉python在字典中寻找关键字'e'。 如果没有find,则返回0.由于这是第一次通过循环传递'e',因此在字典中没有find字符'e',所以get方法返回0.这个0值被添加到1 (存在于字符[character] = characters.get(character,0)+1方程)。 在使用'e'字符完成第一个循环之后,我们现在在字典中有一个条目:{'e':1}

字典现在是:

 characters = {'e': 1} 

现在,让我们通过相同的循环传递第二个'e'(在跳转中find)。 我会假设这是通过循环的第二个字符,我将用它们的新值更新variables:

 for 'e' in "The quick brown fox jumped over the lazy dog.": {'e': 1}['e'] = {'e': 1}.get('e', 0) + 1 

在这里, get方法find一个'e'的键入,并find它的值为1.我们把这个添加到另一个字符.get(character,0)+ 1 ,得到2结果。

当我们在字符中应用这个[character] = characters.get(character,0)+ 1 equation:

 characters['e'] = 2 

应该清楚的是,最后一个等式为已有的“e”键分配一个新的值2。 所以字典现在是:

 characters = {'e': 2} 

从这里开始http://docs.python.org/tutorial/datastructures.html#dictionaries

那么这里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 

如果字符在字典中, characters ,则会得到字典对象。

如果不是,你得到0。


句法:

get(key[, default])

如果键在字典中,则返回键的值,否则返回默认值。 如果没有给出默认值,它默认为None ,所以这个方法永远不会引发KeyError

如果d是一个字典,那么d.get(k, v)意味着给我在d中k的值,除非k不存在,在这种情况下,给我v。在这里使用它来获得当前的计数该字符应该从0开始,如果之前没有遇到该字符。

我看到这是一个相当古老的问题,但是这看起来像是某些东西是在没有语言特征的知识的情况下编写的。 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) ,这个问题有几个答案 – 这个方法返回key的值,或者你提供的default_value。 第一个参数是您正在查找的键,第二个参数是该键不存在时的默认值。