Как изменить список списка в словарь словаря? - PullRequest
0 голосов
/ 09 сентября 2018

Так, например, у меня есть следующий список списков

 A = [['PokedexNumber',  'Name',  'Type',  'Total'], [1.0, 'Bulbasaur', 'GrassPoison', 318.0], [2.0, 'Ivysaur', 'GrassPoison', 405.0],[3.0, 'Venusaur', 'GrassPoison', 525.0]]

Как мне поменять его на словарь словарей?

B = { 1.0 : { 'Name' : 'Bulbasaur', 'Type' : 'GrassPoison', 'Total' : 318.0},

      2.0 : {'Name' : 'Ivysaur', 'Type' : 'GrassPoison', 'Total' : 405.0},

      3.0 : {'Name' : 'Venusaur', 'Type' : 'GrassPoison', 'Total' : 525.0}
    }

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать распаковку последовательности и понимание словаря:

(_, *headers), *data = A

res = {num: dict(zip(headers, values)) for num, *values in data}

Результат:

{1.0: {'Name': 'Bulbasaur', 'Type': 'GrassPoison', 'Total': 318.0},
 2.0: {'Name': 'Ivysaur', 'Type': 'GrassPoison', 'Total': 405.0},
 3.0: {'Name': 'Venusaur', 'Type': 'GrassPoison', 'Total': 525.0}}
0 голосов
/ 10 сентября 2018

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать Pandas:

import pandas as pd

headers, *data = A

df = pd.DataFrame(data, columns=headers)
B = df.set_index('PokedexNumber').to_dict('index')

Результат:

{1.0: {'Name': 'Bulbasaur', 'Type': 'GrassPoison', 'Total': 318.0},
 2.0: {'Name': 'Ivysaur', 'Type': 'GrassPoison', 'Total': 405.0},
 3.0: {'Name': 'Venusaur', 'Type': 'GrassPoison', 'Total': 525.0}}
0 голосов
/ 10 сентября 2018

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

>>> A = [['PokedexNumber',  'Name',  'Type',  'Total'], [1.0, 'Bulbasaur', 'GrassPoison', 318.0], [2.0, 'Ivysaur', 'GrassPoison', 405.0],[3.0, 'Venusaur', 'GrassPoison', 525.0]]
>>> B = {}
>>> for p in A[1:]:
...    B[p[0]] = { 'name': p[1], 'type': p[2], 'total': p[3] }
...
>>> B
{1.0: {'total': 318.0, 'type': 'GrassPoison', 'name': 'Bulbasaur'}, 2.0: {'total': 405.0, 'type': 'GrassPoison', 'name': 'Ivysaur'}, 3.0: {'total': 525.0, 'type': 'GrassPoison', 'name': 'Venusaur'}}

>>>
0 голосов
/ 10 сентября 2018

Вот словарное понимание с нарезкой, которое должно сработать:

A = [['PokedexNumber', 'Name', 'Type', 'Total'], [1.0, 'Bulbasaur', 'GrassPoison', 318.0], [2.0, 'Ivysaur', 'GrassPoison', 405.0],[3.0, 'Venusaur', 'GrassPoison', 525.0]]

B = {x[0]: dict(zip(A[0][1:], x[1:])) for x in A[1:]}

print(B)

Выход:

{
   1.0: {'Name': 'Bulbasaur', 'Type': 'GrassPoison', 'Total': 318.0}, 
   2.0: {'Name': 'Ivysaur', 'Type': 'GrassPoison', 'Total': 405.0}, 
   3.0: {'Name': 'Venusaur', 'Type': 'GrassPoison', 'Total': 525.0}
}

Вот repl для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...