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