【问题标题】:How can I read the syntax of this python dictionary insertion?如何阅读此 python 字典插入的语法?
【发布时间】:2021-01-26 22:06:45
【问题描述】:
foods={}
name="potato"
foods[name]=foods.get(name, 0) +1
print(foods)

我正在创建一个字典和一个字符串。然后,下一行,一切都变得疯狂......

突然间,我们似乎假设新字符串已经存在于新字典中......

foods[name]=

据我从这里的 cmets 了解到,我们正在获取值为 0 的字典键“名称”,

foods.get(name, 0)

并将键的值加一。

+1

我该如何推理这才有意义?

相关:

How can I add new keys to a dictionary?

Why dict.get(key) instead of dict[key]?

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

dict.get() 方法采用 2 个参数:键和默认值(如果该键在 dict 中尚不存在)。

所以foods.get(name, 0) 表示在foods 中查找name 键并返回其值,否则返回0

【讨论】:

    【解决方案2】:

    嗯,我相信第一行很明显:

    foods = {}
    name = "potato"
    

    这里要记住的重要一点是 dicts 是可变的对象。


    接下来,我们有一个dict赋值:

    foods[name] = x
    

    How can I add new keys to a dictionary? 中所述,这基本上是说:“将值xfoods 内的键name 相关联”。如果name 已经存在于foods 中且具有某个值,该值将被x 覆盖。如果字典中不存在,将创建一个新的key:value

    这将从不引发错误*,因为我们不假设任何关于密钥的内容 - 这不是必需的。如上所述,如果密钥不存在,则将创建一个新对。如果密钥已经存在,它将被更新。在内部,调用 dict 的 __setitem__ 方法以允许这种行为:foods[name] = x --> foods.__setitem__(name, x)


    本例中的值为:

    foods.get(name, 0) + 1
    

    Why dict.get(key) instead of dict[key]? 中所述,如果我们不希望代码在缺少某些键时失败,则使用get 方法。它有一个可选参数default(默认为None)。这意味着 dict.get(key, default)dict[key] 的工作方式相同只要密钥存在于 dict 中!如果它不存在,则将返回 default

    所以这一行可以读作“如果字典中存在foods,则将name 的值加1,否则只返回1 (0 + 1)”。这是实现某些计数器的常见结构。我们可以用这一行来代替下面的繁琐结构:

    if name in foods:
        foods[name] += 1
    else:
        foods[name] = 1
    

    您现在可以看到直接替换:如果键存在,get 将返回它的值,然后我们加 1 并将其保存回 dict - 相当于 foods[name] += 1。如果字典中不存在,get 将返回0,然后我们加 1 得到 1,并将其保存在字典中 - 相当于 foods[name] = 1


    另一种选择是使用带有 int 类型的 defaultdict

    foods = defaultdict(int)
    foods[name] += 1
    

    这封装了所有逻辑,当字典中不存在键并且我们尝试访问它时,调用我们提供的类型以创建默认值。在这种情况下,int() 根据需要返回 0


    * 用于可散列键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      相关资源
      最近更新 更多