如何将dict列表转换为dict

sus*_*ush 26 python

如何将字典列表转换为字典.下面是dict列表

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}]
Run Code Online (Sandbox Code Playgroud)

data = {{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}}
Run Code Online (Sandbox Code Playgroud)

joa*_*uin 42

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

new_dict = {}
for item in data:
   name = item['name']
   new_dict[name] = item
Run Code Online (Sandbox Code Playgroud)

使用python 3.x,您还可以以更好的方式使用dict comprehension来实现相同的方法:

new_dict = {item['name']:item for item in data}
Run Code Online (Sandbox Code Playgroud)

正如Paul McGuire在评论中所建议的那样,如果你不想在内部字典中使用这个名字,你可以这样做:

new_dict = {}
for item in data:
   name = item.pop('name')
   new_dict[name] = item
Run Code Online (Sandbox Code Playgroud)

  • 这将留下一个额外的名称字段,这可能是也可能不是用户想要的。(即,新字典看起来像 `{'Lisa Simpson': {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'} ...}`) (3认同)
  • 在分配名称后添加“item.pop('name')”,然后您将不会获得额外的名称字段。 (2认同)
  • @Platinum — 当使用字典作为查找表时,这实际上很常见。另一个数据结构然后可以直接引用字典值而不会丢失键(而不是存储键并在每次访问时在表中查找它)。 (2认同)
  • @Platinum Azure:你是对的,但OP问题并没有提供任何关于这方面的线索.这只是一个可行的解决方案.当我想使用主题信息中的值从主题获取完整信息时,我在某些应用程序中使用了类似的dicts(使用冗余字段).显然,也可以使用其他主键,或者作为sugested,以消除原始字典中的冗余键. (2认同)

phy*_*nfo 22

如果dicts不会共享密钥,那么您可以使用:

dict((key,d[key]) for d in data for key in d)
Run Code Online (Sandbox Code Playgroud)

在你的情况下生成一个带有列表作为值的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)
Run Code Online (Sandbox Code Playgroud)

这会产生:

>>> newdict
`{'age': [37, 17, 57], 'name': ['John Doe', 'Lisa Simpson', 'Bill Clinton'], 'sex': ['M', 'F', 'M']}`
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 10

通过python 3.3以上,您可以使用ChainMap

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

from collections import ChainMap

data = dict(ChainMap(*data))
Run Code Online (Sandbox Code Playgroud)

  • 它只返回行的第一个条目作为字典。 (21认同)

小智 6

我们不要把这个问题过于复杂化:

simple_dictionary = dict(data[0])
Run Code Online (Sandbox Code Playgroud)


ANK*_*ANK 5

试试这个方法:

dict((key, val) for k in data for key, val in k.items())
Run Code Online (Sandbox Code Playgroud)