0

2 つの辞書を考えてみましょう。

d1 = {'current':    [[1369713600, 29], [1369756800, 47], [1369800000, 34]],
      'curr_total': 110,
      'past':       [[1368417600, 2], [1368460800, 70], [1368504000, 10]],
      'past_total': 82}

d2 = {'current':    [(1369713601, 23), (1369756800, 87), (1369800000, 7)],
      'curr_total': 117,
      'past':       [(1368417600, 100), (1368460800, 7), (1368504000, 9)],
      'past_total': 116}
  • 最初の辞書では、一部の値は整数 (合計) であり、その他の値はリストのリストです
  • 2 番目の辞書では、一部の値は整数 (合計) であり、他の値はタプルのリストです。
  • 両方の辞書には、「current」、「cure_total」などの共通キーがあります。
  • 両方の辞書の同じキーの場合、リスト/タプルの最初の値は同じでもそうでなくてもかまいません。

これに基づいて、このような辞書が必要です。

f = {'current':    [[1369713600, 29], [1369713601, 23], [1369756800, 134], [1369800000, 41]],
     'curr_total': 227,
     'past':       [[1368417600, 102], [1368460800, 77], [1368504000, 19]],
     'past_total': 198}

私の試みは次のとおりです。

for i in fo,pl:             
    for j in i:             
        if total.get(j):    
            total[j] += i[j]
        else:               
            total[j] = i[j] 

しかし、最初の値が同じ場合、対応するリストとタプルの 2 番目の値が集計されないことがわかりましたか? 私のやり方はとても素朴ですか?誰かがこれを行うためのよりPythonicで効率的な方法を提案できますか?

4

3 に答える 3

2

'current'とのリストのリストを返す代わりに、'past'このケースにより適切なデータ構造であるため、ここでは dict を使用しています。

それでもリストを返したい場合は、total['current'].items()またはを使用できますtotal['past'].items()

from itertools import chain
d1 = {'current':    [[1369713600, 29], [1369756800, 47], [1369800000, 34]],
      'curr_total': 110,
      'past':       [[1368417600, 2], [1368460800, 70], [1368504000, 10]],
      'past_total': 82}

d2 = {'current':    [(1369713601, 23), (1369756800, 87), (1369800000, 7)],
      'curr_total': 117,
      'past':       [(1368417600, 100), (1368460800, 7), (1368504000, 9)],
      'past_total': 116}

total  = {}
for k,v in chain(d1.iteritems() ,d2.iteritems()):
    if isinstance(v, list):
        for k1, v1 in v:
            dic = total.setdefault(k,{})
            dic[k1] = dic.get(k1,0) + v1
    else:
        total[k] = total.get(k,0) + v

#convert the dicts to list
for k in total:
    if isinstance(total[k], dict):
        total[k] = total[k].items()
print total        

出力:

{'current': [(1369713600, 29), (1369756800, 134), (1369800000, 41), (1369713601, 23)],
 'past': [(1368417600, 102), (1368460800, 77), (1368504000, 19)],
 'curr_total': 227,
 'past_total': 198
}
于 2013-06-12T15:52:53.253 に答える
0

このようなものが動作するはずです

d1 = {'current':    [[1369713600, 29], [1369756800, 47], [1369800000, 34]],
    'curr_total': 110,
    'past':       [[1368417600, 2], [1368460800, 70], [1368504000, 10]],
    'past_total': 82}

d2 = {'current':    [(1369713601, 23), (1369756800, 87), (1369800000, 7)],
    'curr_total': 117,
    'past':       [(1368417600, 100), (1368460800, 7), (1368504000, 9)],
    'past_total': 116}

def merge_dicts(d1, d2):
    d = dict()
    for key, val in d1.items():
        if key in d2:
            try:
                val1 = dict(val)
                val2 = dict(d2[key])
                d[key] = merge_dicts(val1, val2).items()
            except TypeError:
                d[key] = val + d2[key]
        else:
            d[key] = val
    return d

merge_dicts(d1, d2)

出力:

{'curr_total': 227,
 'current': [(1369713600, 29), (1369756800, 134), (1369800000, 41)],
 'past': [(1368417600, 102), (1368460800, 77), (1368504000, 19)],
 'past_total': 198}
于 2013-06-12T15:58:35.593 に答える