我想比较嵌套字典如下:
d = {'siteA': {'00000000': 3, '11111111': 4, '22222222': 5},
'siteB': {'00000000': 1, '11111111': 2, '22222222': 5}}
e = {'siteA': {'00000000': 5}}
f = {'siteB': {'33333333': 10}}
g = {'siteC': {'00000000': 8}}
d
是用于与e
,f
和g
进行比较的完整词典总数。
如果在{em> siteA-00000000 中发现e
,那么我希望两个值(在这种情况下分别为3和5)加起来成为8。
如果未找到f
(在这种情况下为true),我想将字典追加到d['siteB']
中。
如果未找到g
,则想附加到d
中。
谢谢!
答案 0 :(得分:2)
collections.Counter
对于将字典中的值求和并在不存在的键处添加键很有用。由于Counter
是dict
的子类,因此这不会破坏其他操作。除了一次性转换成本外,它高效且专为此类任务而设计。
from collections import Counter
# convert d to dictionary of Counter objects
d = {k: Counter(v) for k, v in d.items()}
# add items from e
for k, v in e.items():
if k in d:
d[k] += Counter(e[k])
# add item from f if not found
for k, v in f.items():
if k not in d:
d[k] += Counter(f[k])
# add item from g if not found
for k, v in g.items():
if k not in d:
d[k] = Counter(v)
结果:
print(d)
{'siteA': Counter({'00000000': 8, '11111111': 4, '22222222': 5}),
'siteB': Counter({'00000000': 1, '11111111': 2, '22222222': 5}),
'siteC': Counter({'00000000': 8})}
答案 1 :(得分:2)
您可以将collections
中的Counter
与defaultdict
结合使用。
顾名思义,计数器计算相同的元素,并且defaultdict通过提供默认值(在这种情况下为空Counter
)来访问不存在的键。然后您的代码变为
from collections import Counter, defaultdict
d = defaultdict(Counter)
d['siteA'] = Counter({'00000000': 3, '11111111': 4, '22222222': 5})
d['siteB'] = Counter({'00000000': 1, '11111111': 2, '22222222': 5})
print(d.items())
> dict_items([('siteA', Counter({'22222222': 5, '11111111': 4, '00000000': 3})),
> ('siteB', Counter({'22222222': 5, '11111111': 2, '00000000': 1}))])
# d + e:
d['siteA'].update({'00000000': 5})
print(d.items())
> dict_items([('siteA', Counter({'00000000': 8, '22222222': 5, '11111111': 4})),
> ('siteB', Counter({'22222222': 5, '11111111': 2, '00000000': 1}))])
# d + f
d['siteB'].update({'33333333': 10})
print(d.items())
> dict_items([('siteA', Counter({'00000000': 8, '22222222': 5, '11111111': 4})),
> ('siteB', Counter({'33333333': 10, '22222222': 5, '11111111': 2, '00000000': 1}))])
# d + g
d['siteC'].update({'00000000': 8})
print(d.items())
> dict_items([('siteA', Counter({'00000000': 8, '22222222': 5, '11111111': 4})),
> ('siteB', Counter({'33333333': 10, '22222222': 5, '11111111': 2, '00000000': 1})),
>. ('siteC', Counter({'00000000': 8}))])
答案 2 :(得分:0)
给出字典dict [site] [address]的格式,也就是说,此合并函数将从dictFrom中获取值,然后根据您的规则将其插入dictTo中。
valuesCheckSeeding = valuesCheckSeeding.map(function(e){return e[0];}); //flatten this array
var filteredArr = valuesDATA.filter(function(e){
return !(this.indexOf(e[0])+1);
},valuesCheckSeeding);
Logger.log(filtetedArr);
这可能比jpp的答案更好,因为dict [site]上的对象仍然都是基本的dict。