2

无法将这些循环转换为字典理解 - 这可能是不可能的。嵌套的Python词典理解

总的想法是,我排除的字典,看起来像这样:

excludes = { 
    "thing1": ["name", "address"], 
    "thing2": ["username"] 
} 

然后,我有,我要“干净”的使用排除

original_dict = { 
    "thing1": {"name": "John", "address": "123 Anywhere Drive", "occupation": "teacher" }, 
    "thing2": {"username": "bearsfan123", "joined_date": "01/01/2015"}, 
    "thing3": {"pet_name": "Spot"} 
} 

较大的字典如果我运行以下:

for k, v in original_dict.iteritems(): 
    if k in excludes.keys(): 
     for key in excludes[k]: 
      del v[key] 

我剩下:

original_dict = { 
    "thing1": {"occupation": "teacher" }, 
    "thing2": {"joined_date": "01/01/2015"}, 
    "thing3": {"pet_name": "Spot"} 
} 

这是完美的,但我不知道如果我能更好地代表这是一个字典解析 - 只需添加我想要的钥匙,而不是删除那些我不知道。

我已经得到下降到第二for但我不知道如何表示在

new_dict = {k: v for (k, v) in original_dict.iteritems()} 

回答

3
{k:{sub_k:val for sub_k, val in v.iteritems() 
    if sub_k not in excludes.get(k, {})} 
for k,v in original_dict.iteritems()} 

注需要excludes.get(k, {})

在您的数据粘贴后在IPython中运行它:

In [154]: %cpaste 
Pasting code; enter '--' alone on the line to stop or use Ctrl-D. 
:{k:{sub_k:val for sub_k, val in v.iteritems() 
: if sub_k not in excludes.get(k, {})} 
: for k,v in original_dict.iteritems()} 
:-- 
Out[154]: 
{'thing1': {'occupation': 'teacher'}, 
'thing2': {'joined_date': '01/01/2015'}, 
'thing3': {'pet_name': 'Spot'}} 

我个人认为,for循环的方法是在不同的开发商的频谱更具可读性和只是一般更好,那么令人惊讶。体验潜在的代码阅读器级别。

不需要邪恶的副作用与del并使用内部dict理解for循环方法的细微变化:

new_dict = {} 
for k, v in original_dict.iteritems(): 
    k_excludes = excludes.get(k, {}) 
    new_dict[k] = {sub_k:sub_v for sub_k, sub_v in v.iteritems() 
        if sub_k not in k_excludes} 
+0

这是优秀的,谢谢。我认为你是对的,但我应该首先提出这个问题:“我应该把它理解为理解”。我也喜欢for循环方法的变体,我可以用它来代替。 – diplosaurus 2015-02-10 20:25:21