使用两个嵌套循环创建字典并输出 JSON

2024-04-26 20:40:08 发布

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

我需要用两个列表(envs和coms)和一个JSON输出(每个输出对应于env com组合)创建一个字典,如下面的脚本所示。我想要的结果字典应该类似于:

{
    "live-business-data-infrastructure": {
        "component": "traveldb", 
        "environment": "test"
    }, 
    { .... }
}

这只是我用原始脚本制作的一个示例,以演示我所追求的:

#!/usr/bin/env python

import json 
envs = [ 'test','live', ]  ## originallt: [ 'test','live',... ]
coms = [ 'traveldb' ]      ## originally: [ 'traveldb','weatherbot',... ]
test_traveldb_stks = [ {
                          "main_stack": 'false',
                          "name": "test-business-data-resources"
                        },
                        {
                          "main_stack": 'true',
                          "name": "test-business-data-infrastructure"
                        }
                      ]
live_traveldb_stks = [ {
                          "main_stack": 'false',
                          "name": "live-business-data-resources"
                        },
                        {
                          "main_stack": 'true',
                          "name": "live-business-data-infrastructure"
                        }
                      ]

aList = []; sDict = {}

for env in envs:
    for com in coms:
        aList.extend([ zz['name'] for zz in eval(env+'_'+com+'_stks') ])
        sDict[aList[-1]] = { 'component':com, 'environment':env }

#print(aList)
print(json.dumps(sDict, sort_keys=True, indent=4))

因为脚本中的sDict[aList[-1]]位,这是非常有效的,但是遗漏了一些数据,但是我不太清楚如何迭代两个嵌套循环并用JSON映射它们以获得所需的dict。有什么建议吗?如果我没说清楚就告诉我。干杯!!你知道吗


Tags: nametestenv脚本comlivedatastack
1条回答
网友
1楼 · 发布于 2024-04-26 20:40:08

我想你已经很接近了,但是为什么你只接受aList中的最后一项呢?通过使用extend而不是append,您可以

aList = [olditem, olditem, newitem, newitem]
                                  # ^ aList[0]

不是

aList = [[olditem, olditem], [newitem, newitem]]
                           # ^ aList[0]

此外,您还需要遍历这些项。尝试:

aList = []
sDict = {}
for com in coms:
    for env in envs:
        for d in eval("{0}_{1}_stks".format(env, com)):
            aList.append(d["name"]) # add name from d to end of aList
            sDict[d["name"]] = {'component': com, 'environment': env}

请注意,如果您只使用aList = []aList.append(...)来填充sDict,而不需要进一步使用它,则可以省略aList = []aList.append(...)。你知道吗

相关问题 更多 >