2017-04-12 8 views
-3

私は同じキーを持つPython辞書のリストを持っています。リスト内のものから大きな辞書を作成したいと思います。つまり、キーが同じであるため、各キーの値がプロセスで上書きされるため、新しいものを作成するために更新プログラムを使用することはできません。私のリストのサンプルは次のとおりです。キーはすべての辞書の中のインスタンスの数まで増やす同じキーのPython辞書をマージする

{0: u'ChIJIxtmpVdCQg0R_TCH5ttvqC0', 
    1: u'ChIJ2RMaMThvQg0R_6hmMXFiG_M', 
    2: u'ChIJQ3PGOWlfQg0RkV-a6JQdrFs', 
    3: u'ChIJ-TjccjhvQg0RVQmnPNgAJv4', 
    ... 
    195: u'ChIJv1KfnmMpQg0R5iC9EmaXN6M', 
    196: u'ChIJd0vQCiOEQQ0RasOKsxksdys', ###HERE STARTS THE NEW DICT!! 
    197: u'ChIJIxtmpVdCQg0R_TCH5ttvqC0', 
    198: u'ChIJ2RMaMThvQg0R_6hmMXFiG_M', 
    199: u'ChIJQ3PGOWlfQg0RkV-a6JQdrFs', 
    ... 

[{0: u'ChIJIxtmpVdCQg0R_TCH5ttvqC0', 
    1: u'ChIJ2RMaMThvQg0R_6hmMXFiG_M', 
    ... 
    195: u'ChIJv1KfnmMpQg0R5iC9EmaXN6M', 
    196: u'ChIJd0vQCiOEQQ0RasOKsxksdys'}, 
{0: u'ChIJIxtmpVdCQg0R_TCH5ttvqC0', 
    1: u'ChIJ2RMaMThvQg0R_6hmMXFiG_M', 
    2: u'ChIJQ3PGOWlfQg0RkV-a6JQdrFs', 
    3: u'ChIJ-TjccjhvQg0RVQmnPNgAJv4', 
    ... 
    100: u'ChIJN7zqEhgmQg0R-NzvqSYG_Ds', 
    101: u'ChIJPTR-xaYoQg0RUrX7K8kQhU4', 
    102: u'ChIJV_pHsIsoQg0ReGKLBXDqOc8', 
    103: u'ChIJtXpyqps7Qg0RXq37551oP4o',... 

私が欲しいもの、次の形式の大きな辞書です。

ありがとうございます。

+2

あなたはあなたのコードだけ最小限の例を含めていただけますか? – splinter

+0

共通キーの値を上書きする代わりに、何をしたいですか? – steffen

+0

辞書には定義された順序がありません。どのようにdictを反復すると要素の定義された順序が生成されないという事実を考えれば、キーにはどのように番号がつけられますか? – languitar

答えて

1

あなたは、単に各要素のキーとして辞書の現在のサイズを盗んことができます。

myDict = {} 
for dictionary in dictionaries: 
    for key in dictionary: 
    myDict[len(myDict)] = dictionary[key] 
+0

これは完璧に動作します!どうもありがとうございました! –

+3

'dict'はPythonの組み込み関数ですが、変数名として使用しません。 –

+1

これは遅いです。犯行はしませんが、私の1本のライナー(私の答えを見てください)は20倍速く走ります。 – steffen

0

あなたが言っているように、キーは連続した整数であるという意味でIDの一種であり、2番目のdictの値を追加したい、つまり元のキーを忘れてしまった場合、

dict(enumerate(list(dict1.values()) + list(dict2.values()))) 

あなたが二つ以上のソースの辞書を持っている場合は、少し余分な魔法が必要です:

dict(enumerate([item for sublist in [list(d.values()) for d in dicts] for item in sublist])) 

(外リストの内包表記はこの質問への受け入れ答えからコピーされます。Making a flat list out of list of lists in Python

+0

事は私のリストに2つしかないのですが、 –

+0

@GonzaloDonoso:私の答えを更新しました。 – steffen

+0

うわー、誰でも私の答えに投票しました:詳細を教えてください! – steffen

1

はこのような何かを試してみてください:

vals = [] 
for d in list_of_dicts: 
    vals.extend(d.values()) 

max_dict = dict(enumerate(vals)) 
+1

あなたは 'vals 'を意味します。extend' –

+0

セマンティクス(ThierryLathuilleのコメントを参照)を修正すると、これは私のone-liner(私の答えを見てください)と同じ速さ、すなわちyannekeの受け入れられた答えよりも20倍高速です。 – steffen

0

これは

dict1 = {1: 'a', 2: 'b'} 
dict2 = {1: 'c', 2: 'd'} 

max_key_in_dict1 = max(dict1.keys()) 
for key in dict2.keys(): 
    dict1[key+max_key_in_dict1] = dict2[key] 
del dict2 

dict1が、その後で動作するはずdict1にdict2をマージする:

{1: 'a', 2: 'b', 3: 'c', 4: 'd'} 
+0

これは非常に遅いです。それは私のone-linerより約80倍遅く実行されます(私の答えを見てください) – steffen

関連する問題