提问人:Frank 提问时间:12/21/2020 最后编辑:Federico BaùFrank 更新时间:12/21/2020 访问量:277
在 python 嵌套字典中计数 |fromkeys() 函数 它是如何工作的?[复制]
Counting in a python nested dictionary | fromkeys() function How it works? [duplicate]
问:
给定一个运行到最大达到阶段的列表,我想将最大值传输到一个嵌套字典中,其中包含每个阶段的尝试次数 (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
为什么所有字典键中的值都相同?
答:
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
评论
{}