2015-01-18 2 views
2

의 사전을 평평하게 그것은 my_dict['b'][(1,2)]도 존재 함을 의미하지는 않습니다.목록 이해 내가 사전의 사전이 사전

[True, False, True, False] 

나는이 달성하기 위해 하나의 지능형리스트를 사용하는 것을 시도하고있다 :

[my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict] 

이이 오류가 발생합니다

나는 부울 값 (특별한 순서없이) 목록을 원하는 :

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-142-dc1565efcdc8> in <module>() 
     6 } 
     7 
----> 8 [my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict] 
KeyError: (2, 3) 

은 모두 my_dict [ 'A'] 및 my_dict [ 'B']에서 (2,3)을 찾는 것으로 보인다. 나는 내가 쓰는 이해력이 적절한 사전에있는 키들을 찾을 것이라고 생각했다.

중첩 된 사전을 병합 할 수있는 this solution을 보았습니다. 나는 또한 명령형 루프로 무차별 적으로 강제 할 수 있음을 안다. 목록 작성이 왜 내가 쓰는 방식대로 작동하지 않는지 이해하려고 노력하고 있습니다.

답변

5

당신은 값의 값을 통해 루프를 원하는 : 방법을 주문하는 루프가 필요

[v for nested in outer.itervalues() for v in nested.itervalues()] 

참고 그 둥지 것; 외부 루프 우선 :

for nested in outer.itervalues(): 
    for v in nested.itervalues(): 
     # use v 

주문이 혼동되었습니다. 귀하의 코드는 기존에 letter이 (가) 있었기 때문에 KeyError (으)로만 제공되었습니다.

데모 :

>>> my_dict = { 
...  'a': {(1,2): True, 
...   (1,3): False}, 
...  'b': {(1,4): True, 
...   (2,3): False} 
... } 
>>> [v for nested in my_dict.itervalues() for v in nested.itervalues()] 
[True, False, False, True] 
+0

OP는 예상대로 보이는대로 [True, False, True, False]를 얻을 수 없다는 것을 알고 싶을 수도 있습니다 - 오 - 결코 신경 쓰지 마세요 - 특별한 순서없이 *를 보지 않았습니다 * -이 경우 목록 대신'Counter '를 사용할 수도 있습니다 :) –

+0

설명 주셔서 감사합니다. 감사드립니다. 목록 내포를 할 때 중첩 순서를 감싸는 것은 어렵습니다. 다른 중첩 된 for 루프처럼 생각하면 이해할 수 있습니다. 웬일인지 나는 다른 방향으로가는 것이 더 의미가 있다고 생각한다. – elsherbini

+0

또한이 작업은 매우 효과적이었습니다 :'[my_dict [letter] [쌍] for my_dict [letter]]'(순서 만 바꾸면) – elsherbini

1

elsherbini 말했듯이,

[my_dict[letter][pair] for letter in my_dict for pair in my_dict[letter]] 

이것은 또한 작동합니다

[little_dict[k] for little_dict in [my_dict[letter] for letter in my_dict] for k in little_dict] 

이 모두 [True, False, False, True]을 생산하고 있습니다.

원래 시도가 작동하지 않는 이유를 알고 싶습니다. 이 전혀 실행

[my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict] 

유일한 이유는 아마도 정의가 이전에 일부 유사한 이해를 실행에서 남은, 이전에 정의 된 letter 있었해야한다는 것입니다. for pair in my_dict[letter]을 해석하려고 시도하고 letter이 이미 정의되어 있지 않으면이 사실을 이해할 수 없습니다. 문자가 이전에 b (이전 목록 이해를 실행하여 남은 값)으로 정의 된 경우 my_dict['b'] 키 쌍을 설정합니다. 그런 다음 for letter in my_dict을보고 문자를 'a''b'으로 설정합니다.그런 다음 첫 번째 부분 인 my_dict[letter][pair]을 평가하려고 시도하지만 b의 키를 사용하므로 문자가 'a' 값일 때 작동하지 않습니다. 다음은

은, 그때 그때 다시 같은 이해를 실행, 부작용으로 letter의 값을 설정 다른 이해를 실행하고 KeyError를 얻을, 당신의 이해를 실행하고 NameError를 얻을. KeyError 만 (실수)를 구비 한 후 발생하는 것으로 상기에서

Python 2.6.9 
>>> my_dict = { 
...  'a': {(1,2): True, 
...   (1,3): False}, 
...  'b': {(1,4): True, 
...   (2,3): False} 
... } 
>>> 
>>> [my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'letter' is not defined 
>>> letter 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'letter' is not defined 
>>> [letter for letter in my_dict] 
['a', 'b'] 
>>> letter 
'b' 
>>> [my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: (2, 3) 
>>> 

참고 letter의 값을 설정. 첫 번째 실행은 대신 NameError을 생성합니다.

+0

아, 왜 내가 KeyError를 얻었는지에 대한 설명에 많은 감사드립니다. 디버깅은 매우 혼란 스러웠습니다. – elsherbini