Python 嵌套 for 的字典理解
Python dictionary comprehension with nested for
无法将这些循环转化为字典理解 - 这可能是不可能的。
一般的想法是我有一个排除字典,如下所示:
excludes = {
"thing1": ["name", "address"],
"thing2": ["username"]
}
然后我有一个更大的字典,我想 "clean" 使用排除项
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}
无法将这些循环转化为字典理解 - 这可能是不可能的。
一般的想法是我有一个排除字典,如下所示:
excludes = {
"thing1": ["name", "address"],
"thing2": ["username"]
}
然后我有一个更大的字典,我想 "clean" 使用排除项
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}