设置嵌套字典中现有键的值而不迭代上层?

时间:2017-10-07 15:20:24

标签: python python-3.x dictionary

我有一个非常大的形式和示例的嵌套字典:
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.

2 个答案:

答案 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中查找值。