【问题标题】:Counting in a python nested dictionary | fromkeys() function How it works? [duplicate]在python嵌套字典中计数| fromkeys() 函数 它是如何工作的? [复制]
【发布时间】:2020-12-21 11:24:03
【问题描述】:

给定一个达到最大达到阶段的运行列表,我想将最大值转移到一个嵌套字典,其中包含 每个阶段的 尝试次数 (t)

这意味着运行 3、4 和 7 应该产生:

{0: {'t': 3}, 1: {'t': 3}, 2: {'t': 3}, 3: {'t': 2}, 4: {'t': 1}, 5: {'t': 1}, 6: {'t': 1}}

第 0、1、2 关各玩了 3 次,第 3 关玩了 2 次,第 4、5、6 关只玩了一次。

  • 我得到以下结果:

    {0: {'t': 14}, 1: {'t': 14}, 2: {'t': 14}, 3: {'t': 14}, 4: {'t': 14}, 5: {'t': 14}, 6: {'t': 14}}
    

源代码

p = {}
p = dict.fromkeys(range(7), {})

runs = (3, 4, 7)

for r in runs:
    for l in range(r):
        if "t" in p[l]:
          p[l]["t"] += 1
        else:
          p[l]["t"] = 1

为什么所有字典的键值都一样?

【问题讨论】:

标签: python dictionary count increment fromkeys


【解决方案1】:

那是因为dict.fromkeys() 为 p 中的每个键设置了相同的对象

尝试做这样的事情

p = { i : {} for i in range(7) }

runs = (3, 4, 7)

for r in runs:
    for l in range(r):
        if "t" in p[l]:
          p[l]["t"] += 1
        else:
          p[l]["t"] = 1

【讨论】:

    【解决方案2】:
    • 使用Dict Comprehension

       p = {n:{} for n in range(7)}
        runs = (3, 4, 7)
      
        for r in runs:
            for l in range(r):
                if "t" in p[l]:
                    p[l]["t"] += 1
                else:
                    p[l]["t"] = 1
        print(p)
      

    fromkeys() 是一个返回新字典的类方法。值默认为无。

    所有值都只引用一个实例,因此通常将 value 设为空列表等可变对象是没有意义的

    要获得不同的值,请改用dict comprehension


    编辑

    值得一提:

    • 使用setdefault Method:

       for r in runs:
                for l in range(r):
                    if "t" in p[l]:
                        p[l]['t'] += 1
                    else:
                        p[l].setdefault('t', 1)
      
    • 预构建带有“t”键的字典。

        p = {n: {'t': 0} for n in range(7)}
        runs = (3, 4, 7)
      
        for l in range(len(runs)):
            for run in range(runs[l]):
                p[run]['t'] += 1
      

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-12-24
      • 2020-12-21
      相关资源
      最近更新 更多