반응형
질문
파이썬에서 딕셔너리 내포(dictionary comprehension)를 만들 수 있을까요?
리스트 내포 없이는 다음과 같이 사용할 수 있습니다:
l = []
for n in range(1, 11):
l.append(n)
리스트 내포를 사용하여 이를 간단하게 줄일 수 있습니다: l = [n for n in range(1, 11)]
.
하지만, 딕셔너리의 키를 동일한 값으로 설정하려면 어떻게 해야 할까요. 다음과 같이 할 수 있습니다:
d = {}
for n in range(1, 11):
d[n] = True # 모든 키에 동일한 값 설정
다음을 시도해 보았습니다:
d = {}
d[i for i in range(1, 11)] = True
그러나 for
에서 SyntaxError
가 발생합니다.
또한 (이 부분은 필요하지 않지만 궁금해서 질문합니다), 딕셔너리의 키를 여러 다른 값으로 설정할 수 있을까요?
d = {}
for n in range(1, 11):
d[n] = n
딕셔너리 내포로 이것이 가능할까요?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
이 역시 for
에서 SyntaxError
가 발생합니다.
답변
파이썬 2.7+에서는 dictionary comprehensions이 있지만, 시도하고 있는 방식과는 조금 다릅니다. 리스트 컴프리헨션과 마찬가지로 새로운 사전을 생성합니다. 기존의 사전에 키를 추가하기 위해서는 사용할 수 없습니다. 또한, 키와 값을 명시적으로 지정해야 합니다. 물론 필요하다면 더미 값으로 지정할 수 있습니다.
>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
모두 True로 설정하려면:
>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}
보여주신 것처럼 기존 사전에 한 번에 여러 키를 설정하는 방법을 요청하고 있는 것 같습니다. 직접적인 바로 가기는 없습니다. 이미 보여주신 것처럼 루프를 사용하거나, 새로운 값을 가진 새로운 사전을 생성하기 위해 사전 컴프리헨션을 사용한 다음, oldDict.update(newDict)
를 사용하여 새로운 값을 기존 사전에 병합할 수 있습니다.
반응형
댓글