使用理解创建字典列表时如何省略键和值
How to omit key and value when creating list of dictionaries using comprehension
我正在从一个单独的词典列表创建一个词典列表并转换内容。我想在理解过程中有条件地排除键,但我不确定如何。这是我正在尝试做的一个例子:
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]
那么你的问题是 "can I write a function to transform",即 "yes" 如果有任何方法可以描述你正在尝试做的事情(你的例子还远未完成):
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
我正在从一个单独的词典列表创建一个词典列表并转换内容。我想在理解过程中有条件地排除键,但我不确定如何。这是我正在尝试做的一个例子:
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]
那么你的问题是 "can I write a function to transform",即 "yes" 如果有任何方法可以描述你正在尝试做的事情(你的例子还远未完成):
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