我正在从单独的词典列表中创建词典列表并转换内容。我想在理解过程中有条件地排除键,但不确定如何。这是我要执行的操作的一个示例:
old_dict_list = [
{ 'old_key_1': 'value1a', 'old_key_2': 'value2a', 'old_key_3': 'value3a'},
{ 'old_key_1': 'value1b', 'old_key_2': 'value2b', 'old_key_3': 'value3b'},
]
new_dict_list = [
{
'new_key1': old_dict['old_key_1'],
'new_key2': old_dict['old_key_2'], # exclude this key entirely if some condition is met
'new_key3': old_dict['old_key_3'],
}
for old_dict in old_dict_list
]
print(new_dict_list)
我不知道有什么办法在使用这种理解方式时完全有条件地排除键。我唯一的想法是在满足条件时使用像None这样的固定键值,然后单独通过字典列表并删除那些None键。
仅通过一个理解过程就可以做到这一点吗?
这里是一个把戏,通常是一个大拇指,如果可能,应该避免使用把戏。
new_dict_list = [
{
'new_key1': old_dict['old_key_1'],
'new_key3': old_dict['old_key_3'],
**({} if old_dict['old_key_2'].endswith("b") else {'new_key2': old_dict['old_key_2']})
}
for old_dict in old_dict_list
]
print(new_dict_list)
# [{'new_key1': 'value1a', 'new_key3': 'value3a', 'new_key2': 'value2a'}, {'new_key1': 'value1b', 'new_key3': 'value3b'}]
我使用**
运算符解开字典。如果满足条件,则该格为{}
,如果不满足条件,则为{'new_key2': old_dict['old_key_2']}
。因此,仅在不满足条件的情况下才创建键new_key2
。
在此示例中,条件为old_dict['old_key_2'].endswith("b")
,但是您可以在old_dict
上设置任何其他条件。
我不会对您正在理解中列出新清单感到困惑。
很显然,如果您可以将字典从旧格式转换为新格式,这只是
new = [transform(o) for o in old]
您的问题是“我是否可以编写要转换的函数”,如果有任何方法可以描述您要执行的操作,则为“是”(您的示例还远远不够完成:]]
def transform(old):
return {new(k): v for k, v in old.items() if condition(k, v)}
def new(key):
return {'old_key_1': 'new_key1', ...}[key]
def condition(key, value):
if key == 'old_key_2' and value == 'value2b':
return False
return True