我有一个非常大的形式和示例的嵌套字典:
keyDict = {f:{t:{c_1:无,c_2:无,c_3:无,...,c_n:无}}}
另一个包含键和值的字典: valDict = {c_1: 13.37 ,c_2: -42.00 ,c_3: 0.00 ,... c_n: -0.69 }
我想使用valDict尽快将值分配给keyDict的最低级别。
我认为我目前的实现速度非常慢,因为我遍历了keyDict的2个上层[f] [t]。必须有一种方法来设置低级别的值而不关心高级别,因为[c]的值不依赖于[f] [t]的值。
我目前的SLOW实施:
for f in keyDict:
for t in keyDict[f]:
for c in keyDict[f][t]:
keyDict[f][t][c] = valDict[c]
仍在寻找解决方案。 [c]只有几千个密钥,但是[f] [t]可以有数百万个,所以我这样做,不同的值分配发生了数百万次,它应该能够通过底层并分配不依赖于f,t的值,但仅限于c。
为了澄清每个Alexis请求的示例:c词典不一定都具有相同的键,但是c词典对于给定的键具有相同的值。例如,为简单起见,假设c dict(c_1,c_2,c_3)只有3个可能的键。现在一个父词典(ex f = 1,t = 1)可能只有{c_2}而另一个父词(f = 1,t = 2)可能有{c_2和c_3}而另一个(ex f = 999,t) = 999)可能有三个{c_1,c_2和c_3}。一些父母dicts可能具有相同的c组。我要做的是将值分配给c dict,它完全由c键定义,而不是T或F.
答案 0 :(得分:1)
如果最嵌套的dicts和valDict
共享完全相同的键,使用dict.update
而不是循环遍及dict的所有键会更快:
for dct in keyDict.values()
for d in dct.values():
d.update(valDict)
此外,它更优雅,可能更快速地直接循环外部dicts的值,而不是迭代键,然后使用当前键访问该值。
答案 1 :(得分:1)
因此,您需要保持同步数百万个“c”词典。字典有不同的键集(大概是有充分理由的,但我相信你会发现你的更新代码将新值放在 all 字典中),但非None
值必须锁步改变。
您尚未解释此数据结构的用途,但从您的说明判断,您应该只有一个c
字典,而不是数百万字典。
毕竟,你只有一组有效的“c”值;维护多个副本不仅是一个性能问题,它还会给代码带来难以置信的一致性负担。但显然,更新单个字典将比更新数百万字典快得多。
当然,您还想知道每个字典中包含哪些键:为此,您的字典树应该以键组终止,您可以根据需要使用这些键来查找值。
如果我的描述不清楚,以下是您的结构将如何转换:
all_c = dict()
for for f in keyDict:
for t in keyDict[f]:
all_c.update(k,v for k, v in keydict[f][t].items() if v is not None)
keydict[f][t] = set(keydict[f][t].keys())
此代码使用来自每个底层“c”词典的非空值构建组合字典all_c
,然后使用其键列表替换后者。如果您以后需要keyDict[f][t]
处的完整字典(而不是访问特定值),您可以像这样重建它:
f_t_cdict = dict((k, all_c[k]) for k in keyDict[f][t])
但我非常确定你可以通过使用集合keyDict[f][t]
做任何你正在做的事情,并直接在组合字典all_c
中查找值。