这就是我所拥有的:
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
]
问题是,“名称”的值必须为字符串。如何为列表理解添加条件?
编辑:所有其他值必须保留整数
编辑:我现在的解决方法:
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]
答案 0 :(得分:4)
您可以这样做:
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}]
答案 1 :(得分:3)
除了执行dict.fromkeys()
之外,您还可以简单地将其写出来,将dict理解嵌套在列表理解中:
ports = [ {key: (str(port) if key == "name" else port) for key in keys}
for port in ports]
答案 2 :(得分:1)
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
可以位于任意位置。
答案 3 :(得分:0)
您应该可以使用下面的方法
[{key: str(port) if key=="name" else port for key in keys} for port in ports]