簡體   English   中英

嵌套的Python字典理解

[英]Python dictionary comprehension with nested for

無法將這些循環轉換為字典理解-這可能是不可能的。

一般想法是,我有一個排除字典,如下所示:

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()}
{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循環方法更具可讀性,並且通常更好,也就不那么令人驚訝。

for循環方法的微小變化,不需要使用del邪惡的副作用,並且使用內部dict理解:

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM