2012-01-14 4 views
3

중첩 된 두 개의 파이썬 사전을 결합하려고합니다. 각각 최상위 레벨에는 10 개의 키가 있으며, 10 개의 키에는 'datetimes'와 'values'라는 두 개의 키가 더 있습니다. 낮은 수준에서 중첩 된 사전의 각 키에는 약 100 000 개의 항목이 있습니다.2 개의 pkl 파일에서 파이썬 중첩 사전을 만드는 방법/2 중첩 된 사전을 하나로 결합 하시겠습니까?

2 개의 사전 원본은 2 개의 pkl 파일에 있습니다. 나는로드 기능을 사용하여 2 개의 사전으로 이들을 unpickling하고있다. 이 2 개의 pkl 파일 중 1 개의 사전이있는 방법이 있습니까? 그렇지 않다면 어떻게 2 개의 사전을 하나로 결합 할 수 있습니까?

나는 this solution을 시도했지만 한 사전을 다른 것으로 덮어 쓰고 예제에서와 같이 색인이없는 사전을 가지고 있기 때문에 this solution을 사용할 수 없습니다. 제안 된대로 .copy()를 사용하면 here도 하나의 사전을 다른 것으로 덮어 씁니다. 하나의 사전을 또 다른 사전에 추가 할 수 있다면 좋겠지 만 this post은 사전이 그렇게 작동하지 않는다고 제안하는 것처럼 보입니다.

그래서이 사전에서 배열을 만든 다음 모양을 바꾸고 연결할 수 있다고 생각했습니다. 그러나 그것은 매우 느립니다. 내가 정확하게 당신이 당신의 (a DICT 이해를 사용하여 원하는 것을 성취 할 수 있다고 생각하여 문제를 이해한다면

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

답변

2

:

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) 

그래서 나는이 명령을 실행하려고 : 여기에 지금까지 무엇을 가지고 버전 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 구조의 예와 무엇을 당신이 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을주고 예에서 동일한 동일한 상단 키가 있습니다. 이 둘의 차이점은 실제로 한 해의 데이터가 있고 다른 해는 다른 해의 데이터입니다. 그래서 당신의 예제를 다음과 같이 수정하면 :'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 ], '값': [7,6,17,16]}, 'topkey2': { 'datetimes': [5,4,35,34], '값': [3,2,43,42]} }'저는 독해력을 이해하는 것이 방법이라고 생각합니다. 그러나 파이썬으로 5 주 동안의 경험으로는 저를 거기서 끌어들이지는 못합니다. 나는 내가 나중에 나온 결과를 반영하기 위해 어떻게 든 이해력을 수정한다면 당신의 솔루션이 효과가 있다고 생각합니다. 고마워, 아이나. – Aina

관련 문제