【问题标题】:Python dictionary comprehension with nested for带有嵌套 for 的 Python 字典理解
【发布时间】:2015-04-11 00:08:01
【问题描述】:

无法将这些循环转化为字典理解 - 这可能是不可能的。

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

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()}

【问题讨论】:

    标签: python dictionary list-comprehension dictionary-comprehension


    【解决方案1】:
    {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-loop 方法更具可读性,而且通常更好,也不会令人惊讶。

    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}
    

    【讨论】:

    • 这太好了,谢谢。我认为你是对的,我应该先问“我应该把它变成一种理解”这个问题。我也喜欢 for 循环方法的变体,我可以改用它。
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2013-07-28
    • 2011-06-06
    • 2016-06-08
    • 2021-12-22
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多