在 python 嵌套字典中计数 |fromkeys() 函数 它是如何工作的?[复制]

Counting in a python nested dictionary | fromkeys() function How it works? [duplicate]

提问人:Frank 提问时间:12/21/2020 最后编辑:Federico BaùFrank 更新时间:12/21/2020 访问量:277

问:

给定一个运行到最大达到阶段的列表,我想将最大值传输到一个嵌套字典中,其中包含每个阶段的尝试次数 (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 字典 计数 增量

评论

1赞 Peter Wood 12/21/2020
dict.fromkeys 的文档说它们具有相同的值。因此,您传入的空字典 ,在他们所有人之间共享。{}
1赞 Peter Wood 12/21/2020
请参阅此答案:stackoverflow.com/a/43772300/1084416

答:

0赞 Federico Baù 12/21/2020 #1
  • 使用字典推导

     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 默认为 None。

所有值都只引用单个实例,因此 value 是可变对象(如空列表)通常没有意义

若要获取不同的值,请改用字典推导式


编辑

值得一提的是:

  • 使用 setdefault 方法

     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
    
1赞 C.Georgiadis 12/21/2020 #2

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

试着做这样的事情

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