从具有条件的列表创建字典

2024-04-18 22:22:24 发布

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

以下是我所拥有的:

ports = [ 1111, 2222, 3333 ]
keys = ['port', 'target_port', 'name']
ports = [dict.fromkeys(keys, port) for port in ports]

这将产生:

[
    {
        "port": 1111,
        "target_port": 1111,
        "name": 1111
    }
    xxx
]

问题是,“name”的值必须是字符串。如何在列表中添加条件?你知道吗

编辑:所有其他值必须保持整数
编辑:我目前的解决方法:

for port_dict in ports:
    port_dict['name'] = str(port_dict['port'])

最后使用了与已接受答案相反的答案,这样我就有可能在列表的末尾添加关键字:

keys = ['name', 'port', 'target_port']
ports = [{**dict.fromkeys(keys[1:], port), "name": str(port)}
         for port in ports]

Tags: 字符串答案namein编辑target列表for
3条回答

你可以做:

ports = [ 1111, 2222, 3333 ]
keys = ['port', 'target_port', 'name']

result = [{ **dict.fromkeys(keys[:2], port), "name" : str(port) } for port in ports]
print(result)

输出

[{'target_port': 1111, 'name': '1111', 'port': 1111}, {'target_port': 2222, 'name': '2222', 'port': 2222}, {'target_port': 3333, 'name': '3333', 'port': 3333}]

不用做dict.fromkeys(),你可以简单地把它写出来,在列表理解中嵌套一个dict理解:

ports = [ {key: (str(port) if key == "name" else port) for key in keys}
          for port in ports]

Daniel Mesejo给出了一个很好的解决方案,但是对于一点扩展能力,您可以定义自己的函数,以便在字典理解中使用:

def force_str(val, key, str_keys):
    if key in str_keys:
        return str(val)
    else:
        return val

result = [{k: force_str(p, k, ['name']) for k in keys} for p in ports]

# [{'port': 1111, 'target_port': 1111, 'name': '1111'}, 
#  {'port': 2222, 'target_port': 2222, 'name': '2222'}, 
#  {'port': 3333, 'target_port': 3333, 'name': '3333'}]

这允许您将任意数量的str_keys传递到函数中,key可以位于任何位置。你知道吗

相关问题 更多 >