繁体   English   中英

字典列表中的字典

[英]Dict from list of dicts

我有一个字典列表。

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

在该字典列表中,每个字典都有一个键和该键的一个值,如上所示。

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

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

如何在Python中执行此操作?

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

您可以使用内置的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 (如本答案所示)比使用dict.setdefault()更简单,更快。

文档中

collections.defaultdict工作:

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

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

您可以使用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']}

很简单

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM