使用理解创建字典列表时如何省略键和值

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