理解Python中的.get()方法

74 投票
5 回答
164576 浏览
提问于 2025-04-15 18:03
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 个回答

14

首先可以从这里开始了解: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 错误。

26

为了理解发生了什么,我们来看看sentence字符串中的一个字母(重复出现多次),并跟踪它在循环中是如何变化的。

记住,我们一开始有一个空的characters字典。

characters = {}

我选择字母'e'。让我们第一次通过循环处理字符'e'(在The这个单词中找到的)。我假设这是第一个进入循环的字符,并将变量替换为它们的值:

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'第一次进入循环,所以在字典里还没有这个字符,因此get方法返回0。这个0的值会加到1上(在characters[character] = characters.get(character,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。我们把这个值加上另一个1,得到2作为结果。

当我们把这个应用到characters[character] = characters.get(character, 0) + 1这个公式时:

characters['e'] = 2

很明显,最后这个公式给已经存在的'e'键分配了一个新值2。因此,字典现在是:

characters = {'e': 2}
91

字典的 get 方法(比如说 characters)的工作方式和直接用索引访问字典是一样的。不同的是,如果你查找的键不存在,get 不会报错(像 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)。

撰写回答