从词典列表中的词典

问题描述 投票:1回答:5

我有一个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做到这一点?

python python-3.x dictionary
5个回答
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
投票

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
投票
bigD = {}
for element in dictList:
    for key in element:
        if key in bigD:
            bigD[key].append(element[key])
        else:
            bigD[key] = element[key]

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

0
投票

非常简单。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.