2016-08-31 5 views
4

У меня есть список с главными ключами и список списков списков, где первое значение каждого закрытого списка (например, 'key_01') должно быть вспомогательным ключом для соответствующих значений (например, 'val_01', 'val_02'). Данные представлены здесь:Вложенные списки вложенных dicts

master_keys = ["Master_01", "Master_02", "Master_03"] 
data_long = [[['key_01','val_01','val_02'],['key_02','val_03','val_04'], ['key_03','val_05','val_06']], 
      [['key_04','val_07','val_08'], ['key_05','val_09','val_10'], ['key_06','val_11','val_12']], 
      [['key_07','val_13','val_14'], ['key_08','val_15','val_16'], ['key_09','val_17','val_18']]] 

Я хотел бы, чтобы эти списки будут объединены в словарь словарей, например:

master_dic = { 
"Master_01": {'key_01':['val_01','val_02'],'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06']}, 
"Master_02": {'key_04': ['val_07','val_08'], 'key_05': ['val_09','val_10'], 'key_06': ['val_11','val_12']}, 
"Master_03": {'key_07': ['val_13','val_14'], ['key_08': ['val_15','val_16'], 'key_09': ['val_17','val_18']} 
} 

То, что я получил до сих пор является суб ДИКТ:

import itertools 

master_dic = {} 
servant_dic = {} 
keys = [] 
values = [] 
for line in data_long: 
    for item in line: 
     keys.extend(item[:1]) 
     values.append(item[1:]) 
servant_dic = dict(itertools.izip(keys, values)) 

Который выдает словарь, как и ожидалось.

servant_dic = { 
'key_06': ['val_11','val_12'], 'key_04': ['val_08','val_07'], 'key_05': ['val_09','val_10'], 
'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06'], 'key_01': ['val_01','val_02'] 
} 

Проблема заключается в том, что если я хочу, чтобы добавить master_keys в этот словарь, так что я получаю желаемый результат, я должен был бы сделать это в определенном порядке, который был бы возможно, если каждая строка имел счетчик, как это:

enumerated_dic = 
{ 
0: {'key_01':['val_01','val_02'],'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06']}, 
1: {'key_04': ['val_07','val_08'], 'key_05': ['val_09','val_10'], 'key_06': ['val_11','val_12']}, 
2: {'key_07': ['val_13','val_14'], ['key_08': ['val_15','val_16'], 'key_09': ['val_17','val_18']} 
} 

Я хотел бы сделать это с enumerate(), в то время как каждая линия servant_dic построена, но не могу понять, каким образом. С тех пор я мог просто заменить счетчики 0, 1, 2 и т. Д. С помощью master_keys.

Благодарим за помощь.

ответ

6
master_keys = ["Master_01", "Master_02", "Master_03"] 
data_long = [[['key_01','val_01','val_02'],['key_02','val_03','val_04'], ['key_03','val_05','val_06']], 
      [['key_04','val_07','val_08'], ['key_05','val_09','val_10'], ['key_06','val_11','val_12']], 
      [['key_07','val_13','val_14'], ['key_08','val_15','val_16'], ['key_09','val_17','val_18']]] 


_dict = {} 

for master_key, item in zip(master_keys, data_long): 
    _dict[master_key] = {x[0]: x[1:] for x in item} 

print _dict 
+0

Довольно короткая, Nice работа +1. –

+0

Спасибо @RahulKP – turkus

+0

После прочтения '' zip() '(снова), это меня осенило. @turkus и @ ig-melnyk, ваш подход действительно научил меня тому, что я хотел узнать здесь, спасибо! @mpiskore, подход, использующий '.pop()', для меня, является очень творческим. Мне нравится это. – MrPadlog

1

Вы также можете использовать pop и Dict понимание:

for key, elements in zip(master_keys, data_long): 
    print {key: {el.pop(0): el for el in elements}} 
    ...: 
{'Master_01': {'key_02': ['val_03', 'val_04'], 'key_03': ['val_05', 'val_06']}} 
{'Master_02': {'key_06': ['val_11', 'val_12'], 'key_04': ['val_07', 'val_08'], 'key_05': ['val_09', 'val_10']}} 
{'Master_03': {'key_07': ['val_13', 'val_14'], 'key_08': ['val_15', 'val_16'], 'key_09': ['val_17', 'val_18']}} 
2

Надежда это поможет:

{master_key: {i[0]: i[1:] for i in subkeys} for master_key, subkeys in zip(master_keys, data_long)} 
1

Мой функциональный подход:

master_dic = dict(zip(master_keys, [{k[0]: k[1::] for k in emb_list} for emb_list in data_long])) 
print(master_dic) 
Смежные вопросы