2017-02-28 3 views
0

나는 다음과 같은 변수가 있습니다 파이썬 사전 값 업데이트

list_m = ["a","b","c"] 
list_s = ['x','y','z'] 
dict_m = dict.fromkeys(list_m[:]) 
dict_s = dict.fromkeys(list_s[:],copy.deepcopy(dict_m)) # empty dict of dicts 

그래서 나는이

dict_s['x']['a']= np.arange(10) 

같은 dict_s의 값을 업데이트에

In[22]: dict_s 
Out[22]: 
{'x': {'a': None, 'b': None, 'c': None}, 
'y': {'a': None, 'b': None, 'c': None}, 
'z': {'a': None, 'b': None, 'c': None}} 

이 나는 ​​

를 얻을 수를
In[27]: dict_s 
Out[27]: 
{'x': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'y': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'z': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}} 
대신 내가 원한의

은/예상 :

In[27]: dict_s 
Out[27]: 
{'x': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'y': {'a': None, 'b': None, 'c': None}, 
'z': {'a': None, 'b': None, 'c': None}} 

이 깊은/얕은 복사 문제 또는 뭔가 다른 경우 내가 정확히 이해하지 않습니다.

+0

이 코드를 수행하려는 이유를 설명하십시오. – Soviut

+0

나는 이전 결과가 아닌 나중 결과를 원합니다 – dayum

+1

귀하의 딥 카피는 한 번만 수행되며이 복사본은 세 개의 키 모두에 할당됩니다. fromkeys 대신에 dict comprehension을 시도하십시오 –

답변

3

fromkeys은 각 키에 대해 동일한 기본값을 사용합니다. 별도의 값을 원하는 경우에 당신은 fromkeys과 각 값에 대해 새로운 DICT을 DICT 이해를 사용하여 생성 할 수 있습니다

>>> list_m = ["a","b","c"] 
>>> list_s = ['x','y','z'] 
>>> dict_s = {x: dict.fromkeys(list_m) for x in list_s} 
>>> dict_s 
{'y': {'a': None, 'c': None, 'b': None}, 'x': {'a': None, 'c': None, 'b': None}, 'z': {'a': None, 'c': None, 'b': None}} 
>>> dict_s['y']['a'] = 100 
>>> dict_s 
{'y': {'a': 100, 'c': None, 'b': None}, 'x': {'a': None, 'c': None, 'b': None}, 'z': {'a': None, 'c': None, 'b': None}}