Как преобразовать список dict в dict

Как преобразовать список dict в dict. Ниже приведен список dict

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}]

to

data = {{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}}

Ответ 1

Возможное решение с использованием имен в качестве новых ключей:

new_dict = {}
for item in data:
   name = item['name']
   new_dict[name] = item

С помощью python 3.x вы также можете использовать методы распознавания для одного и того же подхода более приятным образом:

new_dict = {item['name']:item for item in data}

Как было предложено в комментарии Пола МакГуара, если вы не хотите, чтобы имя во внутреннем dict, вы можете сделать:

new_dict = {}
for item in data:
   name = item.pop('name')
   new_dict[name] = item

Ответ 2

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

dict((key,d[key]) for d in data for key in d)

Возможно, лучше в вашем случае генерировать dict со списками как значения?

newdict={}
for k,v in [(key,d[key]) for d in data for key in d]:
  if k not in newdict: newdict[k]=[v]
  else: newdict[k].append(v)

Это дает:

>>> newdict
`{'age': [37, 17, 57], 'name': ['John Doe', 'Lisa Simpson', 'Bill Clinton'], 'sex': ['M', 'F', 'M']}`

Ответ 3

Возможно, вы хотите, чтобы имя было ключевым? Вы действительно не указываете, так как ваш второй пример недействителен и не имеет смысла.

Обратите внимание, что мой пример удаляет ключ "имя" из значения, которое может быть желательно (или, возможно, нет).

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}]
newdata = {}
for entry in data:
    name = entry.pop('name') #remove and return the name field to use as a key
    newdata[name] = entry
print newdata
##{'Bill Clinton': {'age': 57, 'sex': 'M'},
## 'John Doe': {'age': 37, 'sex': 'M'},
## 'Lisa Simpson': {'age': 17, 'sex': 'F'}}
print newdata['John Doe']['age']
## 37

Также имейте в виду, что Лиза моложе 17 лет, поэтому даже не думайте об этом.;)

Ответ 4

indice = 1
mlista = [{'uno':1,'dos':2,'tres':3}, {'cuatro':4,'cinco':5,'seis':6}]
mndic = {}
mndic = dict((mlista.index(d)+indice, d) for d in mlista)
print(mndic)
#output {1: {'uno': 1, 'dos': 2, 'tres': 3}, 2: {'cuatro': 4, 'cinco': 5, 'seis': 6}}

Ответ 5

Он также может быть записан следующим образом:

data = {0: {'name': 'John Doe', 'age': 37, 'sex': 'M'},
        1: {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        2: {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}}