Python 如何将dict列表转换为dict

Python 如何将dict列表转换为dict,python,list,dictionary,Python,List,Dictionary,如何将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'}] 到 使用名称作为新键的可能解决方案: new_dict = {} for item in data: n

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


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

new_dict = {}
for item in data:
   name = item['name']
   new_dict[name] = item
使用Python3.x,您还可以以一种更好的方式为相同的方法使用dict理解:

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

也许你想让名字成为关键?您没有真正指定,因为您的第二个示例无效并且没有真正意义

请注意,我的示例从值中删除了键“name”,这可能是需要的(也可能不是)


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

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

链映射将多个DICT或其他映射组合在一起以创建 单一的、可更新的视图。如果未指定贴图,则单个贴图为空 提供字典,以便新链始终至少有一个字典 映射


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

如果您需要一个功能替代方案(也假设名称作为新键),您可以这样做

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)

让我们不要把这件事复杂化:

simple_dictionary = dict(data[0])

尝试将第二行放入Python脚本并运行它。它能正常运行吗?我不这么认为…你的问题在帖子里没有什么意义。您希望生成的dict的键和相关值是什么?您编写的第二件事不是有效的Python对象。您想要的输出不是字典,而是集合!编辑问题可能是为了避免混淆,这将留下一个额外的名称字段,这可能是用户想要的,也可能不是用户想要的。(也就是说,新词典看起来像
{'Lisa Simpson':{'name':'Lisa Simpson',age':17,'sex':'F'}…}
)在指定名称后添加“item.pop('name')”,这样您就不会得到额外的名称字段。@Platinum-当使用词典作为查找表时,这实际上非常常见。然后,另一个数据结构可以直接引用字典值而不会丢失密钥(而不是存储密钥并在每次访问时在表中查找)。@Platinum Azure:你说得对,但OP问题没有给出这方面的任何线索。这只是一个可行的解决方案。当我想使用主题信息中的值从主题获取完整信息时,我在一些应用程序中使用了类似的DICT(使用冗余字段)。显然,也可以使用其他主键,或者按照建议,从原始dict中删除冗余键。如果
数据
是动态的,并且没有固定的
名称
键,该怎么办?有办法解决这个问题吗?只有在我的例子中,
数据
由MongoDB查询组成,所以它不是静态的,这取决于你如何理解辛普森一家的时间。毕竟,如果她在1989年演出开始时只有8岁,那么她今天应该是29岁或30岁…:-)这不是解决办法,但对我的问题有帮助,所以我投票赞成这是一条路。回答得好
from collections import ChainMap

data = dict(ChainMap(*data))
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)
simple_dictionary = dict(data[0])