如何将dict列表转换为dict

时间:2011-03-08 17:51:01

标签: python

如何将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'}]

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

9 个答案:

答案 0 :(得分:38)

使用名称作为新密钥的可能解决方案:

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

使用python 3.x,您还可以以更好的方式使用dict comprehension:

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

如Paul McGuire的评论中所述,如果您不想在内部字典中使用该名称,您可以这样做:

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

答案 1 :(得分:20)

如果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']}`

答案 2 :(得分:3)

python 3.3及更高版本中,您可以使用ChainMap

  

ChainMap将多个字典或其他映射分组在一起以创建   单个可更新的视图。如果未指定地图,则为一个空白   提供字典,以便新链始终至少包含一个   映射。

from collections import ChainMap

data = dict(ChainMap(*data))

答案 3 :(得分:1)

也许您希望这个名字成为关键?您没有真正指定,因为您的第二个示例无效且无意义。

请注意,我的示例从值中删除了键“name”,这可能是理想的(或者可能不是)。

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

答案 4 :(得分:1)

最好的方法是dict((key,val)for k in data for key,val in k.items())

答案 5 :(得分:1)

让我们不要过于复杂:

simple_dictionary = dict(data[0])

答案 6 :(得分:0)

IN

答案 7 :(得分:0)

只要您想要一个功能上的替代品(还假设需要使用名称作为新键),就可以

from toolz.curried import *

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

newdata = pipe(data, 
               map(lambda x: {x['name']: dissoc(x, 'name')}),
               lambda x: merge(*x)
)

print(newdata)

答案 8 :(得分:-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'}}