16

중첩 된 사전 comprehensions을 파이썬 3에서 이해하는 데 어려움이 있습니다. 아래 예제에서 얻은 결과는 올바른 구조를 오류없이 출력하지만 내부 키 : 값 쌍 중 하나만 포함합니다. 나는 이런 중첩 된 사전 이해의 예를 발견하지 못했다. "중첩 된 사전 독해 Python"이라는 용어는 기존 사례, 중첩되지 않은 이해 또는 다른 접근 방식을 사용하여 해결 된 답변을 보여줍니다. 잘못된 구문을 사용하고있을 수 있습니다.중첩 된 사전 이해 python

예 :

data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()} 

이 예에서는 일본어 사전을 반환하지만 myfunc 의해 수정 내부 값으로한다.

outer_dict 사전의 구조뿐만 아니라, 그 결과

{outer_k: {inner_k: inner_v, ...}, ...} 

답변

20

{inner_k: myfunc(inner_v)}는 사전 이해 아니다. 그것은 단지 사전 일뿐입니다.

당신은 아마이 대신 같은 뭔가를 찾고 :

data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()} 

를 가독성을 위해, 사전 함축하고 지능형리스트 너무 많이하지 둥지를 않습니다.

+1

대단히 고마워요. - 누군가에게 도움이된다면, 저를 혼란스럽게합니다. 블렌더의 해결책은 나의 예에서 두 가지 변화가 있습니다 : 이동 된 대괄호와 바깥쪽에 '내부'를 넣는 것입니다. 원래는 for 절이 올바르게 설정되어 있었지만 잘못된 부분의 대괄호를 사용하여 "NameError : global name 'outer_v"가 정의되지 않았습니다. "그런 다음'for '와 같은 오류가 for에있는 대괄호와 함께 잘못된 위치에 있습니다. 올바른 장소. –

20

일부 행 구분 들여 쓰기를 추가 :

data = { 
    outer_k: {inner_k: myfunc(inner_v)} 
    for outer_k, outer_v in outer_dict.items() 
    for inner_k, inner_v in outer_v.items() 
} 

... 당신이 실제로 하나, "2 차원"DICT 이해가가 명백한 것으로한다. 당신이 실제로 원하는 것은 아마도 :

data = { 
    outer_k: { 
     inner_k: myfunc(inner_v) 
     for inner_k, inner_v in outer_v.items() 
    } 
    for outer_k, outer_v in outer_dict.items() 
} 

(블렌더가 추가 공백과 함께, 그의 대답에 제안 정확히입니다).

+0

또한 매우 유용합니다. for 루프 내에서 1 축에 대해 dict comp를 사용하는 것과 비교해 보겠습니다. 또한 미적으로 라인별로 분리하는 가장 좋은 방법을 살펴 보겠습니다. –