理解Python中的.get()方法

时间:2010-01-14 23:35:11

标签: python

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

5 个答案:

答案 0 :(得分:74)

dict的get方法(例如characters)就像索引dict一样,除了如果缺少键,而不是引发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

你问题中的示例代码显然是在尝试计算每个字符的出现次数:如果它已经有给定字符的计数,get会返回它(所以它只增加一个),否则get返回0(因此,在字符串中第一次出现的字符时,递增会正确地给出1

答案 1 :(得分:21)

为了理解发生了什么,让我们在句子字符串中取一个字母(重复多次),并按照循环中的内容进行操作。

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

开始
characters = {}

我会选择字母'e'。让我们通过循环第一次传递字符'e'(在 一词中找到)。我将假设它是第一个完成循环的字符,我将用变量替换变量:

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

characters.get('e',0)告诉python在字典中查找键'e'。如果没有找到,则返回0.由于这是第一次'e'通过循环,字符'e'尚未在字典中找到,因此 get 方法返回0。然后将此0值添加到 1 (出现在字符[character] = characters.get(字符,0)+ 1 等式中)。 在使用'e'字符完成第一个循环后,我们现在在字典中有一个条目,如下所示:{'e':1}

字典现在是:

characters = {'e': 1}

现在,让我们通过相同的循环传递第二个'e'(在单词jumped中找到)。我将假设它是第二个通过循环的字符,我将用它们的新值更新变量:

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

此处 get 方法找到“e”的键条目,并找到其值为1。 我们将其添加到characters.get(字符,0)+ 1 中的其他 1 ,并获得2作为结果。

当我们在字符[character] = characters.get(字符,0)+ 1等式中应用它时:

characters['e'] = 2

应该清楚的是,最后一个等式为已经存在的'e'键分配了一个新值2。 因此字典现在是:

characters = {'e': 2}

答案 2 :(得分:10)

从这里开始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])

     

如果key在字典中,则返回key的值,否则返回default。如果未给出默认值,则默认为None,因此此方法永远不会引发KeyError

答案 3 :(得分:6)

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

答案 4 :(得分:2)

我认为这是一个相当古老的问题,但这看起来像是在没有语言功能知识的情况下编写某些内容的时候之一。 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。第一个参数是您要查找的键,第二个参数是该键不存在时的默认值。