Python 字典理解与嵌套 for

标签 python dictionary list-comprehension dictionary-comprehension

将这些循环转化为字典理解时遇到困难 - 这可能是不可能的。

总体思路是我有一个排除字典,如下所示:

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}

关于Python 字典理解与嵌套 for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28440485/

相关文章:

python - 为什么 strptime 和 strftime 的行为不同,你会怎么做?

python - 迭代字典中字典的键内的值

Haskell "Couldn' t 将预期类型 ‘a’ 与实际类型 ‘[a0]’ 匹配“

python - 将包含字符串的列表全部转换为小写或大写

python - 如何在 plotly 中将单行添加到散点图?

python - 在 Windows 10 上 pip 安装 torchvision 时出错

python - 查找字母的所有组合,从字典中的不同键中选择每个字母

javascript - 使 Leaflet 侧边栏 div 在标记单击时处于事件状态,反之亦然

python - 在 python 中排除以下划线开头或长度超过六个字符的文件夹

list - 从列表列表中删除空列表的每个实例