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

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

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

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

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

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



답변

중괄호. 키워드 인수를로 전달 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  ^


답변

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

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

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


답변

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

  • 그것은 모든 종류의 키에서 작동하므로 예를 들어 말할 수 {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
  • 사전 리터럴의 특수 구문을 사용하지 않았다면 존재하지 않았을 것입니다.

답변

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


답변

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

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


답변

때때로 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) 범위)]))


답변

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

a=1,
b=2,

에:

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

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

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

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

  • 항상 문자열은 아닙니다
  • 숫자, ASCII 문자 및 밑줄 만 포함 할 수 없습니다
  • 정수로 시작합니다 ( dict(1foo=2)SyntaxError 발생)