我有一个嵌套字典,如:
data = {
'level1a': {'level2a':[1,2,3]},
'level1b': {'level2b':[4,5,6]},
'level1c': {'level2a':[7,8,9]}
}
现在我想找到并总结两个具有相同级别2关键字('level2a')的列表。结果应该是这样的:
[8, 10, 12]
有没有一种有效的方法呢?
答案 0 :(得分:0)
这样的事情:
from collections import Counter
from operator import add
data = {
'level1a': {'level2a':[1,2,3]},
'level1b': {'level2b':[4,5,6]},
'level1c': {'level2a':[7,8,9]}
}
c = Counter()
dic = {}
for k,v in data.iteritems():
for k1, v1 in v.iteritems():
c[k1] += 1
val = dic.setdefault(k1, [0]*len(v1))
dic[k1] = map(add, v1, val)
for k,v in c.iteritems():
if v > 1:
print dic[k]
<强>输出:强>
[8, 10, 12]
答案 1 :(得分:0)
尝试:
result=[]
for first_key, first_value in data.iteritems():
for second_key, second_value in first_value.iteritems():
if second_key == 'level2a':
if result == []:
result += second_value
else:
result=[result[i] + value for i,value in enumerate(second_value)]
这将遍历每个检查第二级dicts中的正确密钥。 if / else循环确定是否已将任何项添加到结果中。如果是这样,它将根据'level2a'中的下一个列表递增值。这也假设所有第二级列表的长度相同,否则result
中的尾随值将不会增加。
答案 2 :(得分:0)
您可以尝试这样的事情:
>>> data = {
... 'level1a': {'level2a':[1,2,3]},
... 'level1b': {'level2b':[4,5,6]},
... 'level1c': {'level2a':[7,8,9]}
... }
>>>
>>> def sum_matches(data, match):
... inner = data.itervalues()
... matches = (x[match] for x in inner if match in x)
... return [sum(x) for x in zip(*matches)]
...
>>>
>>> sum_matches(data, 'level2a')
[8, 10, 12]