2016-07-26 4 views
1

Я пытаюсь преобразовать список списков в гнездовой словаре:Преобразовать список списков в гнездовой словарь

Мой код:

csv_data={} 
    for key, value in csv_files.iteritems(): 
     if key in desired_keys: 
      csv_data[key]=[] 

      for element in value: 
       csv_data[key].append(element[1:]) 

Этот код дает мне следующее:

{ 'Network': [ 
     ['Total KB/sec', 'Sent KB/sec', 'Received KB/sec'], 
     ['0.3', '0.1', '0.3'] 
    ], 
    'CPU': [ 
     ['Processor Time', 'User Time', 'Privileged Time'], 
     ['13.8', '6.7', '7.2'] 
    ] 
} 

Так что в этом случае каждый «значение» представляет собой список, содержащий два списка, containung в «название» список и список «числовое значение»

Однако я хочу, чтобы произвести формат, как:

{ 'Network': { 
     'Total KB/sec':0.3, 
     'Sent KB/sec':0.1, 
     'Received KB/sec':0.3 
    }, 
    'CPU': { 
     'Processor Time':'13.8', 
     'User Time': '6.7', 
     'Privileged Time': '7.2' 
    } 
} 

Как я должен изменить свой код, чтобы произвести этот вывод?

ответ

4

Предположим, что я демонстрирую использование zip() на одном из ваших ключей, Network:

>>> network = [ 
    ['Total KB/sec', 'Sent KB/sec', 'Received KB/sec'], 
    ['0.3', '0.1', '0.3'] 
] 

zip() ИНГ два списка дадут множество кортежей, которые могут быть превращены в Словаре, просто вызвав dict() на Это. Другими словами,

>>> dict(zip(network[0], network[1])) 
{'Received KB/sec': '0.3', 'Sent KB/sec': '0.1', 'Total KB/sec': '0.3'} 

Повторите для CPU ключа.

+1

Я просто оставлю о ne-liner, который я написал здесь, может ли он быть полезен OP, а не идти впустую. 'csv_data [key] = dict (zip (* (строка [1:] для строки в значении)))' –

0

подход без zip

dct = { 'Network': [ 
     ['Total KB/sec', 'Sent KB/sec', 'Received KB/sec'], 
     ['0.3', '0.1', '0.3'] 
    ], 
    'CPU': [ 
     ['Processor Time', 'User Time', 'Privileged Time'], 
     ['13.8', '6.7', '7.2'] 
    ] 
} 

for key, val in dct.items(): 
    placeholder_dct= {} 
    for i in range(len(val[0])): 
     placeholder_dct[val[0][i]] = val[1][i] 
    dct[key] = placeholder_dct 

print(dct) 
2

zip() поставляется в очень удобно для переборе списков одновременно, и преобразования в словарь становится очень легко с dict().

def to_dict(dic): 
    for key, value in dic.iteritems(): 
     dic[key] = dict(zip(* value)) 
    return dic 

Пример вывода:

d = {'Network': [['Total KB/sec', 'Sent KB/sec', 'Received KB/sec'], 
['0.3', '0.1', '0.3']], 
'CPU': [['Processor Time', 'User Time', 'Privileged Time'], 
['13.8', 6.7', '7.2']]} 

print to_dict(d) 
>>> {'Network': {'Sent KB/sec': '0.1', 'Total KB/sec': '0.3', 'Received 
KB/sec': '0.3'}, 'CPU': {'Processor Time': '13.8', 'Privileged Time': 
'7.2', 'User Time': '6.7'}} 

Как это работает?

При использовании функции почтового индекса в списках она возвращает список кортежей пара и перебирают различные уровни списков лечащих их параллельных списков путем соединения каждого из списков элементов, охватывающих списки на их соответствующих индекс. Так что, если мы изолировать zip(* value) операцию мы можем ясно видеть результат операции:

>>> [('Total KB/sec', '0.3'), ('Sent KB/sec', '0.1'), ('Received 
    KB/sec', '0.3')] 
    [('Processor Time', '13.8'), ('User Time', '6.7'), ('Privileged 
    Time', '7.2')] 
0

Попробуйте этот код:

{x:{z:t for z,t in (dict(zip(y[0], y[1]))).items()} for x,y in data.items()} 

Когда вход:

data={ 'Network': [ 
    ['Total KB/sec', 'Sent KB/sec', 'Received KB/sec'], 
    ['0.3', '0.1', '0.3'] 
], 
'CPU': [ 
    ['Processor Time', 'User Time', 'Privileged Time'], 
    ['13.8', '6.7', '7.2'] 
]} 

Выход:

res= {'Network': {'Sent KB/sec': '0.1', 'Total KB/sec': '0.3', 'Received KB/sec': '0.3'}, 'CPU': {'Processor Time': '13.8', 'Privileged Time': '7.2', 'User Time': '6.7'}}