【问题标题】:Understanding .get() method in Python [duplicate]了解 Python 中的 .get() 方法
【发布时间】:2010-01-14 23:35:11
【问题描述】:
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 在做什么,其余的一切似乎都很简单。

【问题讨论】:

    标签: python


    【解决方案1】:

    dict 的 get 方法(例如 characters)的工作方式与索引 dict 类似,不同的是,如果缺少键,而不是引发 KeyError,它会返回默认值(如果您调用.get,只带一个参数,key,默认值为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 将返回它(因此它只是加一),否则@987654330 @ 返回 0(因此在字符串中第一次出现字符时,递增正确地给出了 1)。

    【讨论】:

      【解决方案2】:

      要了解发生了什么,让我们在 sentence 字符串中取一个字母(重复多次),然后跟踪它通过循环时会发生什么。

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

      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',所以在字典中还没有找到字符 '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。 我们将其添加到 characters.get(character, 0) + 1 中的另一个 1 并得到 2 作为结果。

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

      characters['e'] = 2
      

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

      characters = {'e': 2}
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2011-01-05
              • 2013-10-27
              • 1970-01-01
              • 2019-11-30
              • 2018-01-17
              • 1970-01-01
              • 1970-01-01
              • 2020-02-22
              • 2015-09-13
              相关资源
              最近更新 更多