Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据具有条件的列表创建字典_Python_List_Dictionary_If Statement - Fatal编程技术网

Python 根据具有条件的列表创建字典

Python 根据具有条件的列表创建字典,python,list,dictionary,if-statement,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

以下是我所拥有的:

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]
你可以做:

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

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

ports = [ {key: (str(port) if key == "name" else port) for key in keys}
          for port in ports]
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'}]

这允许您将任意数量的
stru键
传递到您的函数中,并且
键可以位于任何位置。

您应该可以使用下面的

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

ports[“name”]=str(ports[“name”])
看看这是怎么回事-3,有人能解释一下这个合法的问题出了什么问题吗?我猜否决票是因为你没有尝试解决方案。将数据从整数更改为字符串是一个简单的操作。您的解决方案可能并不漂亮,但询问“我如何在一个语句中做到这一点?”通常是有利的,而不是“我如何做到这一点?”我确实做到了,我甚至展示了我当前的解决方案,我只是在寻找更干净的东西。没人读这个问题?:)所有这些缺点对于提出有效问题的人来说都是相当令人沮丧的。然后做
{“name”:str(port),**dict.fromkeys(key[:2],port)}
。注意:插入顺序仅在Python版本为3.6+@4c74356b41时才重要。请记住,只有在Python 3.6+@Daniel Mesejo中才能保证插入顺序。如果要沿着这条路线走,为什么不简单地执行:
[{“port”:port,“target_port”:port,“name”:str(port)}表示端口中的端口]
?@greencloftguy,如果是键或其键位置发生变化时,此代码也需要重写。@greensky在列表comp中直接指定键还是在单独的列表中指定键没有区别,只要它们只指定一次即可。事实上,我的解决方案避免了两次指定
“name”
键,这是进一步的改进。