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

2024-09-27 04:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从一个单独的字典列表创建一个字典列表,并转换内容。我想在理解过程中有条件地排除键,但我不确定如何排除。下面是我尝试做的一个例子:

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键

有没有办法在一次理解中做到这一点


Tags: keynone内容列表new字典过程条件
2条回答

这里有一个技巧,作为一个经验法则,如果可能的话,你应该避免技巧

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'}]

我使用了**操作符来解压dict。如果满足条件,则此dict为{},如果不满足条件,则为{'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

相关问题 更多 >

    热门问题