创建一个迭代迭代两个嵌套循环和一个JSON输出的dict

时间:2014-01-02 14:55:25

标签: python json list dictionary

我需要从两个列表中创建一个字典 - 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]]位,但由于脚本中的{{1}}位错过了一些非常有用的数据但却无法弄清楚如何迭代两个嵌套循环并将其与JSON映射以获得所需的字典。有什么建议)?如果我没说清楚,请告诉我。干杯!!

1 个答案:

答案 0 :(得分:1)

我认为你很接近,但为什么你只选择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和{{1}}。