根据字典值将字典转换为字典列表

2024-06-25 23:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有不同的字典,我想重新组合成字典列表,同时考虑到它们的不同值:

字典:

[{'language': 'de', 'suggestion': 'fressen', 'comment': 'for animals'},
{'language': 'de', 'suggestion': 'essen', 'comment': ''},
{'language': 'fr', 'suggestion': 'manger', 'comment': ''},
{'language': 'fr', 'suggestion': 'bouffer', 'comment': 'slang'}]

字典列表:

^{pr2}$

我还是python初学者,我不知道从哪里开始,用相同的“语言”:“de”将所有字典分组到同一个dict


Tags: 列表for字典commentdefrlanguageanimals
3条回答

一个简单的解决方案,假设所有dicts的键都相同:

ld = [{'language': 'de', 'suggestion': 'fressen', 'comment': 'for animals'},
{'language': 'de', 'suggestion': 'essen', 'comment': ''},
{'language': 'fr', 'suggestion': 'manger', 'comment': ''},
{'language': 'fr', 'suggestion': 'bouffer', 'comment': 'slang'}]

langs = {i['language'] for i in ld}

d = []

for lang in langs:
    d.append({"language": lang})
    for key in ld[0].keys() - ["language"]:
        d[-1][key] = [i[key] for i in ld if i["language"] == lang]

print(d)

输出:

^{pr2}$

如果您选择使用@FMc在他对您的问题的评论中描述的数据结构,那么您可以使用这条长长的一行代码,用嵌套的理解来做任何事情:

^{3}$

输出:

{'de': {'essen': '', 'fressen': 'for animals'},
 'fr': {'bouffer': 'slang', 'manger': ''}}

有点复杂的解决方案,但是:

>>> dicts = [{'language': 'de', 'suggestion': 'fressen', 'comment': 'for animals'},
... {'language': 'de', 'suggestion': 'essen', 'comment': ''},
... {'language': 'fr', 'suggestion': 'manger', 'comment': ''},
... {'language': 'fr', 'suggestion': 'bouffer', 'comment': 'slang'}]
>>> main_key = 'language'
>>> result_dict = dict()
>>> for d in dicts:
...     for key, value in d.iteritems():
...             if key == main_key:
...                     result_dict.setdefault(d[main_key], dict())[main_key] = value
...             else:
...                     result_dict.setdefault(d[main_key], dict()).setdefault(key, list()).append(value)
...
>>> result_dict.values()
[{'comment': ['', 'slang'], 'language': 'fr', 'suggestion': ['manger', 'bouffer']}, {'comment': ['for animals', ''], 'language': 'de', 'suggestion': ['fressen', 'essen']}]

基于main_key值,我们将这个键上列表中的所有其他字典连接起来。在

使用reduce可以将合并和合并逻辑清楚地分开:

#!/usr/bin/env python

from pprint import pprint
from collections import defaultdict

def group(grouped, ungrouped):
    group = grouped[ungrouped['language']]
    group['language'] = ungrouped['language']
    group['suggestion'].append(ungrouped['suggestion'])
    group['comment'].append(ungrouped['comment'])
    return grouped

ungrouped = [{'language': 'de', 'suggestion': 'fressen', 'comment': 'for animals'},
             {'language': 'de', 'suggestion': 'essen', 'comment': ''},
             {'language': 'fr', 'suggestion': 'manger', 'comment': ''},
             {'language': 'fr', 'suggestion': 'bouffer', 'comment': 'slang'}]

grouped = reduce(group, ungrouped, defaultdict(lambda: defaultdict(list))).values()

# Convert defaultdict to dict for pretty printing.
pprint([dict(group) for group in grouped])

相关问题 更多 >