python函数返回一个包含值的字典,以及一个对应的键列表,这些键的值来自原始字典

2024-09-24 00:35:12 发布

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

我有一个字典,我正在创建一个函数,它获取相同的每个值,并用值的键创建一个新字典。我有一些医生测试的例子。我相信这可以在一行使用列表理解来完成。在

>>> rating = {"bob": "excellent", "barnum": "passing", "beatrice": "satisfactory", "bernice": "passing", "ben": "no pass", "belle": "excellent", "bill": "passing", "bernie": "passing", "baxter": "excellent"}
>>> new_dict(rating) # new_dict is the function
>>> {'excellent': ['bob', 'belle', 'baxter'], 'passing': ['barnum', 'bernice', 'bill', 'bernie'], 'satisfactory': ['beatrice'], 'no pass': ['ben']}

Tags: no字典passbobbenratingbillexcellent
3条回答

您可以使用itertools.groupby和排序来执行一行代码:

>>> from itertools import groupby
>>> {k:[x[0] for x in g] for k,g in groupby(sorted(rating.items(), key=lambda x:x[1]),lambda x:x[1])}
{'passing': ['bernice', 'barnum', 'bernie', 'bill'], 'no pass': ['ben'], 'excellent': ['belle', 'baxter', 'bob'], 'satisfactory': ['beatrice']}
>>>

但这是不必要的低效,它需要一个排序操作来具体化一个辅助列表,而且它过于复杂。不要试图只写一句话。编写干净易读的代码,高效地使用python数据结构。只需使用一个collections.defaultdict,这是分组的标准方式:

^{pr2}$

我不认为写这篇文章是一种理解。考虑来自^{}模块的^{}。在

>>> from collections import defaultdict
>>> 
>>> result = defaultdict(list)
>>> for k, v in rating.items():
...:    result[v].append(k)
...:    
>>> result
>>> 
defaultdict(list,
            {'excellent': ['bob', 'baxter', 'belle'],
             'no pass': ['ben'],
             'passing': ['barnum', 'bernice', 'bill', 'bernie'],
             'satisfactory': ['beatrice']})

这有时间复杂性O(n),任何我尝试过的理解,比如

^{pr2}$

在O(n**2)时更糟。在

用列表理解法尽可能缩短答案。我确信有一种方法可以将函数缩减为一行。在

def new_dict(rating):
    my_dict = dict([(i,[]) for i in set([value for key,value in rating.items()])])
    [my_dict[value].append(key) for key,value in rating.items()]
    return my_dict

rating = {"bob": "excellent", "barnum": "passing", "beatrice": "satisfactory", "bernice": "passing", "ben": "no pass", "belle": "excellent", "bill": "passing", "bernie": "passing", "baxter": "excellent"}
print(new_dict(rating)) # new_dict is the function

这将打印以下输出:

^{pr2}$

相关问题 更多 >