簡體   English   中英

如何將字典列表轉換為字典

[英]how to convert list of dict to dict

如何將字典列表轉換為字典。 以下是字典列表

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

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

使用名稱作為新鍵的可能解決方案:

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

使用 python 3.x,您還可以以更好的方式將 dict 推導用於相同的方法:

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

正如 Paul McGuire 在評論中所建議的,如果您不想在內部 dict 中使用該名稱,您可以執行以下操作:

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

如果字典不會共享密鑰,那么您可以使用:

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

在你的情況下,用列表作為值生成一個字典可能更好?

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及以上,你可以使用ChainMap

ChainMap 將多個字典或其他映射組合在一起以創建單個可更新視圖。 如果未指定映射,則提供單個空字典,以便新鏈始終至少具有一個映射。

from collections import ChainMap

data = dict(ChainMap(*data))

試試這個方法:

dict((key, val) for k in data for key, val in k.items())

讓我們不要把它復雜化:

simple_dictionary = dict(data[0])

也許您希望名稱成為關鍵? 您沒有真正指定,因為您的第二個示例無效且沒有真正意義。

請注意,我的示例從值中刪除了鍵“名稱”,這可能是可取的(也可能不是)。

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

我的 5 美分,不喜歡任何答案:

from functools import reduce
collection = [{'hello': 1}, {'world': 2}]
answer = reduce(lambda aggr, new: aggr.update(new) or aggr, collection, {})
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}}

以防萬一您想要一個功能性的替代方案(還假設需要名稱作為新鍵),您可以這樣做

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)
import pandas as pd
data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'},
        {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'},
        {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}]

print(pd.DataFrame(data).to_dict())

也可以這樣寫:

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'}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM