2016-10-08 18 views
0

私は辞書の二つのリストを持っている:Pythonで辞書の2つのリストをマージしますか?

old = [{'a':'1','b':'2'},{'a':'2','b':'3'},{'a':'3','b':'4'},{'a':'4','b':'5'}] 
new = [{'a':'1','b':'100'},{'a':'2','b':'100'},{'a':'5','b':'6'}] 

はどうやって取得するために辞書の二つのリストをマージすることができます

update = [{'a':'1','b':'2,100'},{'a':'2','b':'3,100'},{'a':'3','b':'4'},{'a':'4','b':'5'},{'a':'5','b':'6'}] 

アイデアは「」古いでは新しいものではない場合、それを追加しています新しい 'a'が古いものであれば 'b'を更新し、古いものが新しいものに含まれていなければそれを維持します。

+1

何か試しましたか?以前の試行を表示してください – Li357

+0

更新リストの値に '2'と' 100'と識別しますか? Pythonの辞書は、私が知る限り、同じ鍵に対して複数の値を許さない。表示するものは2つの値ストリングを追加するだけで、後で値を使用できないことがあります。 – Peaceful

+0

bをカンマ区切りの文字列または適切なデータ構造としてフォーマットしますか?つまり、b値のリストですか? –

答えて

0

ここで 'a'が実際のキーであり、bが値である場合、dictsのリストを1つのdictに変換し、マージを処理して元に戻す方が簡単です。この方法で、標準機能を使用することができます。

キーで1つの辞書に変換:再度、データ構造に変換し

def intoRealDict(listOfDicts): 
    values = [] 
    for item in listOfDicts: 
     values.append((item.get('a'), item.get('b'))) 
    return dict(values) #Use Dict Constructur ('3', '4) -> {'3': '4'} 

def intoTheDataStructure(realDict): 
    res = [] 
    for i in realDict: 
     res.append(dict([('a', i), ('b', realDict[i])])) 
    return res 

簡単にあなたの二つのリストのマージ:

def merge(l1, l2): 
    d1, d2 = intoRealDict(l1), intoRealDict(l2) 
    for i in d2: 
     if i in d1: 
      #extend "b" 
      d1[i] = d1[i] + ", " + d2[i] 
     else: 
      #append value of key i 
      d1[i] = d2[i] 
    return intoTheDataStructure(d1) 

ワーキング性能の悪いコード

関連する問題