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

问题描述 投票:0回答:2

我正在从单独的词典列表中创建词典列表并转换内容。我想在理解过程中有条件地排除键,但不确定如何。这是我要执行的操作的一个示例:

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键。

仅通过一个理解过程就可以做到这一点吗?

python list-comprehension dictionary-comprehension
2个回答
0
投票

这里是一个把戏,通常是一个大拇指,如果可能,应该避免使用把戏

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上设置任何其他条件。


0
投票

我不会对您正在理解中列出新清单感到困惑。

很显然,如果您可以将字典从旧格式转换为新格式,这只是

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
© www.soinside.com 2019 - 2024. All rights reserved.