파이썬에서 목록의 키와 빈 값으로 dict를 초기화하는 방법은 무엇입니까?


251

나는 이것으로부터 얻고 싶다 :

keys = [1,2,3]

이에:

{1: None, 2: None, 3: None}

그것을하는 pythonic 방법이 있습니까?

이것은 못생긴 방법입니다.

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

답변:


389

dict.fromkeys([1, 2, 3, 4])

이것은 실제로 클래스 메소드이므로 dict-subclasses (예 :)에서도 작동 collections.defaultdict합니다. 선택적 두 번째 인수는 키에 사용할 값을 지정합니다 (기본값은) None.


153
예를 들어을 호출하면 dict.fromkeys([1, 2, 3], [])모든 키가 동일한 목록에 매핑되고 하나를 수정하면 모두 수정됩니다.
charleslparker 2016 년

8
{k:[] for k in [1, 2, 3]}그래도 초기화 는 여전히 안전합니다.
Aziz Alto

263

아무도 dict-comprehension 솔루션을 제공하는 데 관심이 없었습니까?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
나는 그것이 2.7로 백 포트되었다고 믿는다
wim

21
이것은 훌륭하고 받아 들인 대답이하는 참조 문제로 고통받지 않습니다.
charleslparker 2016 년

또한 기본값 (예 :)을 지정할 수 있습니다 False.
neverendingqs

이것은 Python3 IMO에서 가장 깨끗하고 가장 파이썬적인 방법입니다
Bede Constantinides

4
dict-comp를 사용하면 값을 함수 호출의 결과로 만들 수도 있습니다 (원하는 경우 키를 인수로 전달할 수 있음). 매우 강력한 메커니즘입니다.
martineau


16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

산출:

{'a': [], 'c': [], 'b': [], 'd': []}

1
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유 에 대한 추가 컨텍스트를 제공 하면 답변의 장기적인 가치가 향상됩니다.
프란체스코 멘 자니

4
keyDict코드의 첫 번째 줄이 a set가 아닌을 반환 하므로 이름 이 잘못되었습니다 dict.
Bryan Oakley

10
d = {}
for i in keys:
    d[i] = None

1
왜 파이썬이 다음과 같은 오류를 발생 TypeError: 'type' object is not iterable시키는가?
FaCoffee

1
@FrancescoCastellani 때문에 list유형입니다. 당신이 뭔가를하지 않는 한 list = [], 위의 방법은 항상 당신에게 같은 오류 줄 것이다
smac89

1

에서 많은 사용자가 임의의 키에 대한 기본 / 초기 값을 첨부 할 워크 플로우, 당신은하지 않습니다 필요가 개별적으로 미리 해시에 각 키를. 사용할 수 있습니다 collections.defaultdict. 예를 들면 다음과 같습니다.

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

보다 효율적으로 인스턴스화시 모든 키를 해시하지 않아도됩니다. 또한 defaultdict의 하위 클래스 dict이므로 일반적으로 일반 사전으로 다시 변환 할 필요가 없습니다.

허용 가능한 키에 대한 제어가 필요한 워크 플로의 경우 dict.fromkeys허용 된 답변에 따라 사용할 수 있습니다 .

d = dict.fromkeys([1, 2, 3, 4])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.