중첩 된 Python 사전에서 가장 깊은 키를 명시 적으로 인스턴스화 할 필요가없는 이유는 무엇입니까?

찢다

데이터 구조는 다음과 같습니다 (일반적으로 사전처럼 정렬되지 않음).

{ 'b': { '2': 0.02}, 'a': { '1': 0.01}}

그러한 사전을 만들 때, 파이썬에서 d [ "b"]를 참조하기 전에 'b'가 있는지 확인하지 않는 것은 올바르지 않습니다. d [ "b"] [ "2"] = float (0.02)를 사용하여 'b'로 입력 된 사전에 '2'키를 추가하는 것은 올바르지 않습니다.

다음은이 상황을 설명하는 코드입니다. 주석 처리 된 두 줄을 무시하고 코드는 텍스트 줄을 분할하고 중첩 된 사전을 구성합니다. 즉, 사전의 사전입니다.

d가 단순 사전 (중첩 없음)이면 두 개의 주석 처리 된 행이 작동합니다. 'a'와 'b'가 있는지 확인할 필요가 없습니다.

설명은 무엇입니까?

def f():
  d = {}
  m  = ["a 1 0.01", "b 2 0.02"]

  #d["a"] = 1
  #d["b"] = 2

  for i in range(2):
    (m0,m1,m2) = m[i].split()
    if m0 not in d:
       d[m0] = {}
    d[m0][m1] = float(m2)
Chepner

차이점은

d["b"] = 2

호출을 나타내는 d.__setitem__("b", 2)반면

print d["b"]

대표하다

d.__getitem__("b")

"b"가에서 아직 키가 아닌 dict경우 첫 번째는 단순히 키를 추가하고 두 번째는 a를 발생 KeyError시킵니다.

당신의 라인,

d["b"]["2"] = float(0.02)

하지만 왼쪽에서 오른쪽으로 평가됩니다. 다음과 동일하게 구문 분석됩니다.

(d["b"])["2"] = float(0.02)

이는 d.__getitem__("b")결과가를 호출하기 전에 성공해야 함을 의미 합니다 __setitem__. 다음과 같습니다.

d.__getitem__("b").__setitem__("2", float(0.02))

제쳐두고, 파이썬이 진정한 "다차원"사전을 지원한다면, 같은 것들이와 같은 d["b"]["2"] = float(0.02)것에 매핑 될 것이고 d.__setitem__("b", "2", float(0.02))대부분의 사용은 defaultdict불필요해질 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관