比较嵌套字典

时间:2018-08-01 09:23:08

标签: python dictionary counter

我想比较嵌套字典如下:

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是用于与efg进行比较的完整词典总数。

如果在{em> siteA-00000000 中发现e,那么我希望两个值(在这种情况下分别为3和5)加起来成为8。

如果未找到f(在这种情况下为true),我想将字典追加到d['siteB']中。

如果未找到g,则想附加到d中。

谢谢!

3 个答案:

答案 0 :(得分:2)

collections.Counter对于将字典中的值求和并在不存在的键处添加键很有用。由于Counterdict的子类,因此这不会破坏其他操作。除了一次性转换成本外,它高效且专为此类任务而设计。

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中的Counterdefaultdict结合使用。

顾名思义,计数器计算相同的元素,并且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。