从词典列表中的词典

时间:2018-02-28 19:15:52

标签: python python-3.x dictionary

我有一个dicts列表。

dictList = [
  {'name': 'some name'},
  {'name': 'some other name'},
  {'age': 'some age'},
  {'last_name': 'some last name'}
]

在该dicts列表中,每个dict都有一个键和一个键值,如上所示。

我需要创建一个包含所有dicts键的dict,每个键的每个值都是一个带有dicts列表中的项值的集合。在这个例子中,它是这样的:

expected_dict = {
    'name': ['some name', 'some other name'],
    'age': ['some age'],
    'last_name': ['some last name']
}

我怎样才能在Python中执行此操作?

5 个答案:

答案 0 :(得分:2)

collections.defaultdict是一种方式:

from collections import defaultdict

d = defaultdict(list)

dictList = [
  {'name': 'some name'},
  {'name': 'some other name'},
  {'age': 'some age'},
  {'last_name': 'some last name'}
]

for i in dictList:
    for k, v in i.items():
        d[k].append(v)

# defaultdict(list,
#             {'age': ['some age'],
#              'last_name': ['some last name'],
#              'name': ['some name', 'some other name']})

答案 1 :(得分:1)

您可以使用内置setdefault()功能。

dictList = [
  {'name': 'some name'},
  {'name': 'some other name'},
  {'age': 'some age'},
  {'last_name': 'some last name'}
]

expected_dict = {}

for dictionary in dictList:
    for key, val in dictionary.items():
        expected_dict.setdefault(key, []).append(val)

print(expected_dict)

输出:

{
    'name': ['some name', 'some other name'], 
    'age': ['some age'], 
    'last_name': ['some last name']
}

注意:使用collections.defaultdict(如this answer所示)比使用dict.setdefault()更简单,更快捷。

来自documentation

collections.defaultdict的工作:

  

第一次遇到每个密钥时,它不在映射中;因此,使用default_factory函数自动创建一个条目,该函数返回一个空列表。然后list.append()操作将值附加到新列表。当再次遇到密钥时,查找会正常进行(返回该密钥的列表),list.append()操作会向列表中添加另一个值。这种技术比使用dict.setdefault()的等效技术更简单,更快速。

答案 2 :(得分:1)

bigD = {}
for element in dictList:
    for key in element:
        if key in bigD:
            bigD[key].append(element[key])
        else:
            bigD[key] = element[key]

答案 3 :(得分:1)

您可以使用itertools.groupby

import import itertools
dictList = [
    {'name': 'some name'},
    {'name': 'some other name'},
    {'age': 'some age'},
    {'last_name': 'some last name'}
]
new_list = {a:[c for [[_, c]] in b] for a, b in itertools.groupby(map(lambda x:x.items(), dictList), key=lambda x:x[0][0])}

输出:

{'age': ['some age'], 'last_name': ['some last name'], 'name': ['some name', 'some other name']}

答案 4 :(得分:0)

非常简单。

dict = {} 
list = [1,2,3]
dict['numbs'] = list
print(dict)

输出: {'numbs': [1, 2, 3]}