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

次のようなことを試すことができます:

>>> 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 に答える
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)]

これは、第 2 レベルの dict で正しいキーをチェックしながら、それぞれを反復処理します。if/else ループは、既に結果にアイテムが追加されているかどうかを判断します。その場合、「level2a」の次のリストに従って値を増やします。これはまた、すべての第 2 レベルのリストが同じ長さであることを前提としていresultます。

于 2013-09-18T15:32:36.883 に答える