2016-09-21 3 views
-4

을 덮어 쓰기됩니다내가 다음과 같은 파이썬 코드의 조각을 이전 값

final_dict = {} 
default_dict = some_data 

for dict in list_of_dicts: 
    # I am getting list_of_dicts from a json file 
    resultant_dict = merge_dicts(dict, default_dict) 
    id = return_value_from_a_function(resultant_dict) 
    final_dict[id] = resultant_dict # id will be different in each loop 
(나는 내 ​​실제 코드를 매우 큰 있기 때문에 붙여 넣을 수 없음을 유감스럽게 생각한다)

그래서 final_dict는 id를 키로, calculated_dict를 값으로 사용합니다. 내 문제는 for 루프의 끝에서 final_dict의 모든 내 값이 finally_dict의 마지막 값과 동일하다는 것입니다. 나는 이전 값을 덮어 쓰고 있다고 생각한다. 이 문제를 해결하는 방법 ..?

EDIT 1 : merge_dicts 실제로 두 dicts의 공용체를 만듭니다. results_dict를 인쇄 할 때마다 예상대로 다른 dict을 인쇄합니다. 그러나 final_dict에 값을 할당하면 이전 값을 모두 최신 값으로 수정합니다.

EDIT 2 : 모든 입력 데이터는 json 파일에서 가져 오는 dict입니다. 최종 DICT 아래

final_dict = { 
    id1 : dict1, 
    id2 : dict2 
} 

처럼 보일 것이다 그러나 나는

final_dict = { 
    id1 : dict2, 
    id2 : dict2 
} 

EDIT 3 (그것은 최신 DICT 값이 모든 값을 덮어 쓰기됩니다) 아래와 같이 점점 오전 :이 merge_dicts가

를 작동하는 방법이다
def merge_dicts(tmp1, tmp2): 
''' 
    merges tmp2 into tmp1 
''' 
for key in tmp2: 
    if key in tmp1: 
     if isinstance(tmp1[key], dict) and isinstance(tmp2[key], dict): 
      merge_dicts(tmp1[key], tmp2[key]) 
     else : 
      tmp1[key] = tmp2[key] 
    else: 
     tmp1[key] = tmp2[key] 
return tmp1 
+2

'merge_dicts'의 기능은 무엇입니까? 어떤 입력 데이터를 다루고 있습니까? 출력 데이터가 최종적으로 어떻게 생겼을 까? 좋은 정보를 얻기 위해이 세부 사항을 제공하십시오 – idjaw

+0

당신의'merge_dict' 함수가'default_dict'를 수정하고 그것을 돌려 준다고 의심합니다 –

+0

실제 상황을보다 잘 설명 할 수 있도록주십시오. 당신의 코드? – idjaw

답변

1

id을 먼저 생성 한 다음 바로 merge_dicts 값을 할당하면 어떨까요?

for dict in list_of_dicts: 
    # I am getting list_of_dicts from a json file 
    id = return_value_from_a_function 
    final_dict[id] = merge_dicts(dict, default_dict) 

편집 : return_value_from_a_function 기능 resultant_dict를 사용합니다 때문에,이 return_value_from_a_functionresultant_dict 수정 보인다.

from copy import deepcopy 

for input_dict in list_of_dicts: 
    resultant_dict = {} 
    resultant_dict = merge_dicts(input_dict, default_dict) 
    # I am getting list_of_dicts from a json file 
    value_dict = deepcopy(resultant_dict) 
    id = return_value_from_a_function(resultant_dict) 
    final_dict[id] = value_dict 
+0

결과 값을 반환 값으로 제공하는 함수에 calculated_dict를 전달하기 때문에이 작업을 수행 할 수 없습니다. – user3157132

+0

'return_value_from_a_function'이 results_dict에 아무 것도 쓰지 않습니까? – thiruvenkadam

+0

아니요 그냥 dict를 arg로 취한 다음 id를 반환합니다. 그런 다음 id와 results_dict를 final_dict에 써야합니다. – user3157132

-1

에 넣기 전에 copy.deepcopy(resultant_dict)을 시도한 적이 있습니까?

일반적으로 문제가 해결됩니다.

+0

왜 이것이 도움이 될까요? –

+0

'results_dict'의 주소가 아니라 실제 내용을 저장했기 때문에 생각합니다. 범위에서 내가 대해 다음'A = DICT() B = DICT() 시도 (5) : B [I] = 내가 A [내가] = B 인쇄 – mengg

+0

오른쪽 A',하지만 당신이 할 경우 'final_dict'에 넣기 전에 바로 복사하면 도움이되지 않습니다. OP의 코드에서 그 시점 이후에 돌연변이가 일어나지 않았습니다. –

관련 문제