[python] 파이썬에서 빈 목록 사전을 어떻게 초기화합니까?

프로그래밍 방식으로 목록 사전을 만들려는 시도는 사전 키를 개별적으로 처리 할 수 ​​없습니다. 목록 사전을 만들고 하나의 키에 추가하려고 할 때마다 모두 업데이트됩니다. 다음은 매우 간단한 테스트 케이스입니다.

data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

실제 결과: {0: ['hello'], 1: ['hello']}

예상 결과: {0: [], 1: ['hello']}

작동하는 것은 다음과 같습니다.

data = {0:[],1:[]}
data[1].append('hello')
print data

실제 및 예상 결과 : {0: [], 1: ['hello']}

fromkeys방법이 예상대로 작동하지 않는 이유는 무엇 입니까?



답변

[]두 번째 인수로 전달 dict.fromkeys()하면 다소 쓸모없는 결과가 나타납니다. 사전의 모든 값은 동일한 목록 객체가됩니다.

Python 2.7 이상에서는 대신 사전 이해를 사용할 수 있습니다.

data = {k: [] for k in range(2)}

이전 버전의 Python에서는 다음을 사용할 수 있습니다.

data = dict((k, []) for k in range(2))


답변

대신 defaultdict 를 사용하십시오 .

from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')

이렇게하면 목록에 사용하려는 모든 키를 미리 초기화 할 필요가 없습니다.

귀하의 예에서 일어나는 일은 하나의 (변경 가능한) 목록 을 사용한다는 것입니다 .

alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data

출력 {0: [1, 2], 1: [1, 2]}합니다.


답변

단일 목록에 대한 참조로 사전을 채우므로 업데이트 할 때 업데이트가 모든 참조에 반영됩니다. 대신 사전 이해를 시도하십시오. Python에서 목록 이해력을 사용하여 사전 만들기를 참조
하십시오.

d = {k : v for k in blah blah blah}


답변

이것을 사용할 수 있습니다.

data[:1] = ['hello']


답변