2014-01-02 5 views
0

Мне нужно создать словарь из двух списков - envs и coms - и выход JSON (каждый для каждой комбинации env-com), как и скрипт ниже. Результирующий словарь, который я хотел бы иметь что-то должно быть похоже на это:Создание итерации с помощью двух вложенных циклов и выхода JSON

{ 
    "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. Какие-либо предложения)? Дайте мне знать, если я не очень четко объясню. Ура !!

ответ

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 и не имеют дальнейшего использования для него.

+0

Мне это нравится. Два вопроса: использование 'aList.append (d [" name "])' здесь? и я '' {} _ {} _ stks "' не работает для меня, мне пришлось идти с '" {0} _ {1} _stks "' вместо этого. Тестирование этого в моем первоначальном сценарии на данный момент. Ура !! – MacUsers

+0

Проблема '{}'/'{0}' - это Python 2.x vs. 3.x. Я обновил свой ответ и комментарии. – jonrsharpe

Смежные вопросы