els*_*ini 2 python dictionary list-comprehension python-2.7
我有一本字典词典:
my_dict = {
'a': {(1,2): True,
(1,3): False},
'b': {(1,4): True,
(2,3): False}
}
Run Code Online (Sandbox Code Playgroud)
字典总是这种形式,但每个'子'字典都有一组不同的键:my_dict['a'][(1,2)]存在,但这并不意味着my_dict['b'][(1,2)]也存在.
我想要一个布尔值的列表(没有特定的顺序):
[True, False, True, False]
Run Code Online (Sandbox Code Playgroud)
我试图使用单个列表理解来完成此任务:
[my_dict[letter][pair] for pair in my_dict[letter] for letter in my_dict]
Run Code Online (Sandbox Code Playgroud)
这引发了一个错误:
---------------------------------------------------------------------------
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)
Run Code Online (Sandbox Code Playgroud)
它似乎在my_dict ['a']和my_dict ['b']中寻找(2,3).我认为我写的理解只会在相应的字典中查找键.
我已经看到这个解决方案可以解决任何嵌套字典.我也知道我可以用强制循环来强制它.我只是想弄清楚为什么列表理解不像我写的那样工作.
您想循环值的值:
[v for nested in outer.itervalues() for v in nested.itervalues()]
Run Code Online (Sandbox Code Playgroud)
请注意,循环需要按照嵌套方式进行排序; 外循环首先:
for nested in outer.itervalues():
for v in nested.itervalues():
# use v
Run Code Online (Sandbox Code Playgroud)
你把订单搞砸了; 你的代码只是KeyError因为你有一个预先存在的letter全局代码.
演示:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |