在嵌套字典中查找匹配的关键字

时间:2013-09-18 15:06:41

标签: python dictionary nested keyword matching

我有一个嵌套字典,如:

data = {
    'level1a': {'level2a':[1,2,3]},
    'level1b': {'level2b':[4,5,6]},
    'level1c': {'level2a':[7,8,9]}
}

现在我想找到并总结两个具有相同级别2关键字('level2a')的列表。结果应该是这样的:

[8, 10, 12]

有没有一种有效的方法呢?

3 个答案:

答案 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]