2015-01-22 3 views
0
내가 이것을 이해하는 몇 가지 문제가 있어요

, 나는 내가 시작하는 두 개의 사전 ydateDict이 코드파이썬 사전

for k in y.keys(): 
    if k in dateDict.keys(): 

     if yearDict[k] in dict1: 
      dict1[yearDict[k]].extend(y[k]) 
     else: 
      dict1[yearDict[k]] = y[k] 

     if yearDict[k] in dict2: 
      dict2[yearDict[k]].extend(y[k]) 
     else: 
      dict2[yearDict[k]] = y[k] 
    else: 
     continue 

의 세트에 문제를 줄이기 위해 노력했다. y의 일치 키가 dateDict 인 경우 다른 사전 yearDict의 키를 사용하여 해시 된 다른 두 개의 사전 dict1dict2을 채우고 있습니다. 불행히도 그 결과는 dict1dict2에 중복되어 있습니다. 반복되는 값이 있습니다. 무슨 일이 일어날 지 아무 생각 없어?

또한 나는

for k in y.keys(): 
    if k in dateDict.keys(): 

     if yearDict[k] in dict1: 
      dict1[yearDict[k]].extend(y[k]) 
     else: 
      dict1[yearDict[k]] = y[k] 
    else: 
     continue 
+0

'y [k]'도 목록입니까? – Kolmar

+0

별개의'dictl'과'dict1'을 원하십니까? –

+0

@Kolmar 예, 라파엘은 당신이 어떻게 의미하는지 확실하지 않습니까? –

답변

1

y[k]이 목록은 (는 것처럼 보이는) 인 경우는, 같은 목록이 사용되는 모든 곳 곳에 할당됩니다, 예상대로이 코드가 작동하는지 확인합니다. 사전은 할당 된 요소의 사본을 만들지 않고 요소에 대한 참조 만 유지합니다. 귀하의 예에서 dict1dict2의 키는 과 동일한 개체를 가리 킵니다.

나중에 수정하면 동일한 요소에 각 값을 한 번씩 추가합니다. 이를 방지하려면 처음에 다음을 할당 할 때 새 목록을 만들 수 있습니다.

dictl[yearDict[k]] = list(y[k]) 

그러나 Python 표준 라이브러리는 항상 알고 있어야합니다. 아직 존재하지 않는

핵심 요구
from collections import defaultdict 

# This goes wherever the dictionaries 
# where initially defined. 
dict1 = defaultdict(list) 
dict2 = defaultdict(list) 

# You can get the value here, no need to search it later. 
for k, value in y.items(): 
    if k in dateDict.keys(): 
     # No need to call this everywhere. 
     new_key = yearDict[k] 

     # Note the defaultdict magic. 
     dict1[new_key].extend(value) 
     dict2[new_key].extend(value) 

    # No need for the 'continue' at the end either. 

에서, defaultdict는 즉시 새로운 하나를 만들 것 - 그래서 당신이 코드는 collections.defaultdict를 사용하여 훨씬 더 읽기 및 오류없이 만들어 질 수 초기화에 신경 쓸 필요가 없으며 값의 복사본을 만들 필요가 없습니다.

+0

나는 그 라파엘이 흥미 롭다는 것을 안다. 왜 그런 일이 일어나고, 그 행동은 이상하게 보일 까? –

+0

전혀 이상하지 않습니다. 매개 변수는 참조로 설정됩니다. 따라서 각 dict은 실제로 포함 된 요소에 대한 참조를 유지합니다. 예에서 모든 요소는 동일한 객체에 대한 참조를 유지합니다. –