2012-01-14 23 views
3

2つの入れ子になったPython辞書を組み合わせようとしています。それぞれにはトップレベルに10個のキーがあり、10個のキーのそれぞれに2つのキーがあります: 'datetimes'と 'values'。低レベルでは、ネストされた辞書の各キーには約100,000項目があります。2つのpklファイルからPythonのネストされた辞書を作成する方法/ 2つのネストされた辞書を1つに結合するか?

2つの辞書の由来は、2つのpklファイルからのものです。私は負荷機能を使って2つの辞書にそれらをunpicklingしています。これらの2つのpklファイルから1つの辞書を持つ方法はありますか?そうでない場合は、2つの辞書をどのように組み合わせて1つにすることができますか?

私はthis solutionを試しましたが、別の辞書よりも上書きされてしまい、this solutionが辞書にあるように辞書を使用できませんでした。 .copy()を提案通りに使用すると、hereは1つの辞書を別の辞書に上書きします。 1つの辞書を別の辞書に追加するだけでも大丈夫ですが、this postは辞書がそのように機能しないことを示唆しているようです。

私はこれらの辞書から配列を作成し、それらを再形成して連結することができたかもしれないと考えました。しかし、それは信じられないほど遅いです。ここで私はこれまで持っているものです。

import cPickle 
import numpy as np 

def load(filename, verbose=False): 
    # Open file 
    if verbose : print("Loading %s" % filename) 
    pkl_file = open(filename, 'rb') 
    # Load from Pickle file. 
    data = cPickle.load(pkl_file) 
    pkl_file.close() 

    return data 

def combineDicts(dictList): 
    result = np.array([]) 
    for listItem in dictList: 
     data = np.array([]) 
     for item in listItem.keys(): 
      for innerItem in listItem[item].keys(): 
       data = np.append(data, listItem[item][innerItem]) 
     result = np.append(result, data) 

だから私はこれらのコマンドを実行しようとしています:

>>> dict1 = load('file1.pkl', verbose = True) 
>>> dict2 = load('file2.pkl', verbose = True) 
>>> a = combineDicts([dict1, dict2]) 

答えて

2

私が正しくあなたの問題を理解していれば、私はあなたが(dictの理解を使用して欲しいものを達成することができると思いますバージョン3.xおよび2.7):

>>> dict1 = {'topkey1': {'datetimes': [9,8], 'values': [7,6]}, 'topkey2': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dict2 = {'topkey3': {'datetimes': [9,8], 'values': [7,6]}, 'topkey4': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dictlist = [dict1, dict2] 
>>> new_dict = {key: value for item in dictlist for key, value in item.items()} 
>>> new_dict 
{'topkey4': {'values': [3, 2], 'datetimes': [5, 4]}, 'topkey1': {'values': [7, 6], 'datetimes': [9, 8]}, 'topkey3': {'values': [7, 6], 'datetimes': [9, 8]}, 'topkey2': {'values': [3, 2], 'datetimes': [5, 4]}} 

これは、あなたが最初のdictの構造の例をお願いし、あなたが辞書の最終的な構造で探している探している結果ではない場合。

編集:

次は役立つはずあなたがあなたのコメントに提供した情報に基づいて

>>> dict1 = {'topkey1': {'datetimes': [9,8], 'values': [7,6]}, 'topkey2': {'datetimes': [5,4], 'values': [3,2]}} 
>>> dict2 = {'topkey1': {'datetimes': [29,28], 'values': [17,16]}, 'topkey2': {'datetimes': [35,34], 'values': [43,42]}} 
>>> for key, value in dict2.items(): 
...  for subkey, subvalue in value.items(): 
...   dict1[key][subkey] = dict1[key][subkey] + subvalue 
...  
>>> dict1 
{'topkey1': {'values': [7, 6, 17, 16], 'datetimes': [9, 8, 29, 28]}, 'topkey2': {'values': [3, 2, 43, 42], 'datetimes': [5, 4, 35, 34]}} 
+0

sgallen、あなたはので、両方の辞書と同じ名前をrealltさtopkey1とtopkey3を与える例で同じ同一のトップキーを持つ。両者の違いは、実際には1年間のデータがあり、別のデータは別の年のデータです。あなたの例を次のように変更すると、 'dict1 = {'topkey1':{'datetimes':[9,8]、 ​​'values':[7,6]}、 'topkey2':{'datetimes':[5 、 'values':[3,2]}} ' ' dict2 = {'topkey1':{'datetimes':[29,28]、 'values':[17,16]}、 'topkey2' : '' datetimes ':[35,34]、' values ':[43,42]}} – Aina

+0

出力は '{' topkey1 ':{' datetimes ':[9,8,29,28 ]、[values]:[7,6,17,16]}、 'topkey2':{'datetimes':[5,4,35,34]、 'values':[3,2,43,42]} } '私はdictの理解が行く方法だと思うが、Pythonを使った私の5週間の経験は私をそこに得ることができない。私はあなたの解決策は、私が後に出てくる出力を反映するように理解していればうまくいくはずだと思います。ありがとう、アイナ。 – Aina

関連する問題