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