48581


プログラミング初心者です。(Python2.7・Iron Python使用)  
タプルを含んだキーを持つ辞書型のリストにおいて、キーが重複する際、値を足して1つの辞書型にマージしたいと思っています。  
用途としては、簡単な施設動線のヒートマップの作成です。キーに平面座標、値にその座標の上を人が通過した回数です。

つまり下記のような、  
リスト＝[{(x座標,y座標) : 回数 , (x座標,y座標) : 回数,} , {(x座標,y座標) : 回数 , (x座標,y座標) :
回数},{}...]  
を1つの辞書型にマージする際、同じ座標の上を通過した回数は足して表示したいという事です。

例えば、

[code]

    dict_list = [{(1,2):10, (1,3):10, (2,4):10} , {(1,2):15, (2,3):15, (2,4):15} , {(1,1):3 ,(2,2):3 }, {(1,1):60, (1,2):60}]
    
[/code]

を

[code]

    dict = {(1,1):63, (1,2):85, (1,3):10, (2,2):3 , (2,3):15, (2,4):25}
    
[/code]

という感じにしたいです。

collections importによるCounterを使用して解決できましたが、Iron
pythonを使用しているため、ライブラリーのimportなしで解決したいです。最後に平面座標とその合計回数が分かる形なら辞書型でなくても構いません。

何卒よろしくお願い致します。


CC BY-SA 4.0
2018-09-20T05:51:16.217
48579
2018-09-20T07:09:16.097
2018-09-20T05:58:50.967
2238
30176
question
python python2
辞書型において、タプルのキーが重複する場合、上書きせず連結する方法


愚直に for 文で実装してみました。Python 2.7.15 および 3.6.2 で動作確認済みです。

[code]

    dct_lst = [{(1,2):10, (1,3):10, (2,4):10},
        {(1,2):15, (2,3):15, (2,4):15},
        {(1,1):3 ,(2,2):3},
        {(1,1):60, (1,2):60}]
    
    result = {}
    for dct in dct_lst:
        for k, v in dct.items():
            if k in result.keys():
                result[k] += v
            else:
                result[k] = v
    
    print(result)
    
[/code]


CC BY-SA 4.0
2018-09-20T06:28:27.053
48581
2018-09-20T06:28:27.053
19110
48579
answer


内包表記と3項演算子を使ってみました。  
行数は削減できますが直感的ではありませんので、素直にimportや多重forを使った方が保守しやすいように思います。  
Python 2.7.5, 3.6.1で動作確認済みです。

[code]

    dict_list = [{(1,2):10, (1,3):10, (2,4):10} , {(1,2):15, (2,3):15, (2,4):15} , {(1,1):3 ,(2,2):3 }, {(1,1):60, (1,2):60}]
    result = {}
    for (k, v) in [(k, p[k]) for p in dict_list for k in p]:
        result[k] = result[k] + v if k in result.keys() else v
    
    result
    # {(1, 2): 85, (1, 3): 10, (2, 4): 25, (2, 3): 15, (1, 1): 63, (2, 2): 3}
    
[/code]


CC BY-SA 4.0
2018-09-20T07:09:16.097
48582
2018-09-20T07:09:16.097
9820
48579
answer