dict : 중괄호 리터럴 {} 또는 dict () 함수를 초기화하기 위해 선호되는 구문은 무엇입니까?


212

파이썬을 배우기 위해 노력하고 있으며 일반적인 코딩 표준에 세심한주의를 기울이고 있습니다. 이것은 무의미한 까다로운 질문처럼 보일 수 있지만, 배우면서 모범 사례에 초점을 맞추려고 노력하므로 '나쁜'습관을 배우지 않아도됩니다.

dict를 초기화하는 두 가지 일반적인 방법이 있습니다.

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

어느 것이 "파이 토닉"이라고 여겨지 는가? 어느 것을 사용하십니까? 왜?


5
어떤 튜토리얼을 사용하고 있습니까? 혼란을 초래하는 예를 어디에서 보았습니까?
S.Lott

2
글쎄, 나는 파이썬 튜토리얼을 사용하고 있습니다. 파이썬으로 들어가고 다양한 블로그, SO 게시물 및 기타 Google 리소스를 사용하십시오. 공식 문서는 {}꽤 균일하게 사용 되지만 dict()다른 곳 에서 많은 명시 적 접근 방식을 봅니다. 나는 명백한 구문의 이점을 볼 수 있었지만 공식 문서에 접근 방식이 없으면 나를 의심하게 만들었습니다. 이것을 게시 한 후 라이브러리 문서를 살펴보고 dict명시 성 dict을 사용하여 dict를 초기화 할 때 키가 유효한 식별자 여야한다는 경고를 발견했습니다 .
daotoad

2
"dict ()"가 "{}"보다 더 명확합니까? 혼란을 이해하지 못했습니다. 둘 다 나에게 명백해 보인다. "dict"가 "명시 적"이고 "{}"이 명시 적이 지 않다는 인용 또는 참조를 제공 할 수 있습니까? 이 차이가 어디에서 발생했다고 생각하십니까?
S.Lott

21
구별은 철자입니다. dict()철자가 있습니다- dict유형의 이름을 사용합니다. 중괄호 ( {})는 구두점을 사용하여 유형을 식별합니다.
daotoad

답변:


235

중괄호. 키워드 인수를로 전달 dict()하면 많은 시나리오에서 훌륭하게 작동하지만 키가 유효한 Python 식별자 인 경우에만 맵을 초기화 할 수 있습니다.

이것은 작동합니다 :

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

작동하지 않습니다.

a =                  dict(import='trade', 1=7.8)
>> SyntaxError: invalid syntax  ^

85

첫 번째 중괄호. 그렇지 않으면, 이상한 문자가있는 키와 같은 일관성 문제가 발생합니다 =.

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

11
이것이 바로 초기화를 위해 dict () 메소드를 선호하는 이유이며, 사전 키를 유효한 식별자로 강제 지정하므로 ** kwargs와 호환 가능하고 키는 유효한 속성 이름입니다.
RufusVS

57

첫 번째 버전이 바람직합니다 :

  • 그것은 모든 종류의 키에서 작동하므로 예를 들어 말할 수 {1: 'one', 2: 'two'}있습니다. 두 번째 변형은 (일부) 문자열 키에서만 작동합니다. 키 유형에 따라 다른 종류의 구문을 사용하는 것은 불필요한 불일치입니다.
  • 더 빠릅니다.

    $ python -m timeit "dict(a='value', another='value')"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
  • 사전 리터럴의 특수 구문을 사용하지 않았다면 존재하지 않았을 것입니다.

3

첫 번째 옵션은 a [ 'a'] 또는 a [ 'another']로 값에 액세스하기 때문에 더 좋습니다. 사전의 키는 문자열이며, 그렇지 않은 척할 이유가 없습니다. 나에게 키워드 구문은 처음에는 영리 해 보이지만 두 번째 모양에서는 모호합니다. 는으로 작업 __dict__하고 키워드가 나중에 속성이 될 경우에만 의미 가 있습니다.


3

참고로, 사전에 속성을 추가해야하는 경우 (사전에는 첨부되어 있지만 키 중 하나는 아님) 두 번째 양식이 필요합니다. 이 경우 한 번에 하나씩 임의의 문자를 갖는 키를 사용하여 사전을 초기화 할 수 있습니다.

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

2

때때로 dict()좋은 선택입니다 :

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],

[random.randint (0,100) x 범위 (0,7) 범위)]))


2
이것을 더 잘 할 수있는 열거 함수가 있습니다. 그 문제를 위해 Enum 유형이있어서 더 잘하고 있습니다. 또한 이것은 실제로 질문에 대한 답변이 아닙니다.
dusktreader 2016 년

2

나는 거의 항상 중괄호를 사용합니다. 그러나 테스트를 작성하는 경우 키워드 패킹 / 언 패킹을 수행 하며이 경우 변경 할 필요가 없으므로 dict ()가 훨씬 유지 관리가 가능합니다.

a=1,
b=2,

에:

'a': 1,
'b': 2,

또한 나중에 명명 된 튜플 또는 클래스 인스턴스로 바꾸고 싶을 수도 있습니다.

구현 자체에서 최적화에 대한 집착 때문에 특히 유지 관리 이점이 크지 않을 때는 항상 중괄호를 선호합니다.

테스트와 구현에서 키를 추가하거나 나중에 추가 할 가능성이 있다면 dict ()를 사용하지 않습니다.

  • 항상 문자열은 아닙니다
  • 숫자, ASCII 문자 및 밑줄 만 포함 할 수 없습니다
  • 정수로 시작합니다 ( dict(1foo=2)SyntaxError 발생)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.