2016-10-26 5 views
0

Я начинаю понимать и реализовывать словарное сопоставление. Я пытаюсь построить словарь с вложенными словарей, как это:python словарь для понимания словарей с вложенными циклами

{serviceA: {ip_server1: флаг, ip_server2: флаг ...}, {serviceB ip_server1: флаг, ip_server_2: флаг ... и т.д.}}

У меня возникли проблемы с его построением, как при получении результата. Он просто бросает меня на последний элемент. Я пробовал много способов, и все ведет то же самое. Вот код, который я использовал:

СЛОВАРЬ 1:

services_dict = {key_service: value for key_service,value in config_file.iteritems() if key_service.startswith("s-")} 
#It returns a dictionary in this form {service1: [list_of_flags]} 

Тогда у меня есть внешний список, который имеет IP-адреса сервера

server_list = [S1, S2, S3, S4 .. и т.д.]

После этого я хочу использовать DIC понимание построить полный словарь:

new_services_dict = { key1: {key2:fl} for key1, flag_list in corrected_dict.items() for key2, fl in zip(server_list, flag_list)} 

Проблема заключается в том, что она только возвращает последний элемент списка IP (1 элемент только)

{ 'ServiceA': { 'last_server_ip_in_list': 'Last_flag_in_list'}}

Я не уверен, почему он не добавляет новые значения и просто берет последний элемент на итерации.

Любая помощь была бы принята с благодарностью. Я уже пробовал много способов, и я не могу узнать, какая часть итераиона мне не хватает.

ОБНОВЛЕНО INFO

В соответствии с просьбой в Coment ниже здесь некоторые выборочные данные для выяснения вопроса: Пусть говорят, что мы должны сопоставить список студентов, которые я отделенных от словаря, который содержит субъекты колледжа с сортами:

services_dict = {математика: [ 'A', 'B', 'C', 'D'], баз данных: [ 'B', 'C', 'D' , 'A']} Список студентов = ['Jhon', 'Michael', 'Leslie', 'Lorraine']

Оценки указаны соответственно из списка учеников, так что это не проблема (от кого класс принадлежит кому).

Что предназначил, чтобы получить словарь в виде:

{ 'математики': { 'Jhon': 'А', 'Michael': 'B', 'Лесли': 'C ',' Лотарингия ':' D '}, Базы данных: {' Jhon ':' B ',' Michael ':' C ',' Leslie ':' D ',' Lorraine ':' A '}}

проблема я получаю что new_services_dict возвращает только:

{ 'математика: {' Лотарингия ':' D '}

Я надеюсь, что это яснее, чем объяснение выше.

+2

Мое первое предположение заключалось в том, что 'key1' - это не то, что вы думаете, и все они одинаковы, поэтому вы получаете одну запись. Поместите некоторые фактические структуры данных образца для corrected_dict, server_list и flag_list, чтобы мы могли сориентироваться. – sberry

+0

Я обновил вопрос с помощью образца. Надеюсь, это яснее. Во всяком случае, ответ ниже работает просто отлично. – Pines

ответ

1

Ну, для начала, похоже, что все ключи в new_services_dict будут такими же, поскольку у вас есть вложенный цикл, а не вложенное понимание слова, которое я предполагаю - это то, что вы хотите.

Например,

>>>{k1:{k2:v} for k1 in ['a','b'] for k2,v in zip(['aa','bb'],[1,2])} 
{'b': {'bb': 2}, 'a': {'bb': 2}} # dictionaries are unordered 

Здесь k1 принимает значение 'a' затем приостанавливается до тех пор, k2,v для итерации цикла через все элементы, прежде чем возобновить. Это просто переназначает k1 на {'bb':2}, так как это последний элемент в итерации k2. Вот почему все ваши ценности, вероятно, выходят одинаково.

То, что вы, вероятно, хотите вложенная словарь понимание, что будет выглядеть следующим образом:

>>>{k1:{k2:v for k2,v in zip(['aa','bb'],[1,2])} for k1 in ['a','b']} 
{'b': {'aa': 1, 'bb': 2}, 'a': {'aa': 1, 'bb': 2}} 

Здесь k1 принимает значение 'a' затем делает паузу, пока вложенная понимание не работает.

Проверьте это для получения дополнительной информации и лучшего пояснения по телефону nested comprehensions. Это для понимания списков, но применяется одна и та же логика.

+0

Эй, это здорово, ваш ответ велик. Все прошло отлично. Я пропустил эту часть выполнения вложенного дикта. comperhension. Я проголосовал за ваш ответ, но до сих пор не хватает очков. Спасибо за помощь! – Pines