根据条件从列表创建字典

时间:2019-02-07 18:24:43

标签: python list dictionary if-statement

这就是我所拥有的:

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]

4 个答案:

答案 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]