1

我有一个嵌套字典,例如:

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

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

[8, 10, 12]

有没有一些有效的方法来做到这一点?

4

3 回答 3

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]
于 2013-09-18T15:19:46.010 回答
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)]

这将遍历它们中的每一个,检查这些二级字典中的正确键。if/else 循环确定是否已将任何项目添加到结果中。如果是这样,它将根据“level2a”中的下一个列表增加值。这也假设所有二级列表的长度相同,否则您将拥有result不会增加的尾随值。

于 2013-09-18T15:32:36.883 回答
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]
于 2013-09-18T16:33:39.370 回答