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

Python 根据字典的值将字典转换为字典列表,python,list,dictionary,Python,List,Dictionary,我有不同的字典,我想重新组合成一个字典列表,考虑到它们的不同值: 字典: [{'language': 'de', 'suggestion': 'fressen', 'comment': 'for animals'}, {'language': 'de', 'suggestion': 'essen', 'comment': ''}, {'language': 'fr', 'suggestion': 'manger', 'comment': ''}, {'language': 'fr', 'sugg

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

字典:

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

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

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

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

>>> 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\u键
值,我们在此键上加入列表中的所有其他词典。

一个简单的解决方案,假设所有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)
产出:

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

如果你选择使用@FMc在他对你的问题的评论中描述的数据结构,你可以使用长的一行,用嵌套的理解做每件事:

d = {lang: 
        {i["suggestion"]: i["comment"]
        for i in ld if i["language"] == lang} 
    for lang in {i["language"] for i in ld}}

print(d)
产出:

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

使用
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])

不是很像蟒蛇,但它也能起作用:

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

def prepare(inputData):
    outputData = []
    if inputData and isinstance(inputData[0], dict) and inputData[0].get('language'):
        keys = inputData[0].keys()
        del keys[keys.index('language')]
    else:
        #do something - raise issue or return
        return outputData 
    for l in set(line['language'] for line in inputData):
        langData = {"language": l}
        langData.update([(k, [line[k] for line in inputData if line["language"] == l]) for k in keys])
        outputData.append(langData)
    return outputData

prepare(data)

您的第一个数据结构(dict列表)是合理的:它类似于数据库中的对象列表或行列表。您的第二个数据结构似乎很难使用,因为最终将使用并行数组,其中
ith
建议必须与
ith
注释保持同步。你有没有考虑过一个以语言为顶级键(
de
fr
,等等),以单词本身为第二级键(fressen,essen,等等),以注释为值的dict?事实上,我只想得到这样一个字典,这样它们就可以很容易地在模板中使用,以便使用{{dictionary.language}。如果键是动态的,我实际上不知道如何呈现内容。+1:虽然不是很pythonic,但这是一个非常实用的解决方案。