python函数返回包含值的字典以及原始字典中具有该值的键的对应列表

时间:2018-10-29 04:30:26

标签: python dictionary

我有一个字典,我创建了一个函数,该函数接受每个相同的值,并使用value键创建一个新字典。我有一些示例的文档测试。我相信可以使用列表理解功能在一行中完成。

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

3 个答案:

答案 0 :(得分:2)

您可以使用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,这就是对事物进行分组的规范方法:

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

答案 1 :(得分:1)

我认为没有什么好办法可以将此理解为理解。考虑来自defaultdict模块的collections

>>> {v:[k for k, v_ in rating.items() if v_ == v] for v in rating.values()}
>>> 
{'excellent': ['bob', 'baxter', 'belle'],
 'no pass': ['ben'],
 'passing': ['barnum', 'bernice', 'bill', 'bernie'],
 'satisfactory': ['beatrice']}

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

<button type="button" onclick="myFunction()" id="GreenColour" c_name="green">Green</button><!-- Changes text to Green -->
<button type="button" onclick="myFunction()" id="Bluecolour" c_name="blue">Blue</button><!-- Changes text to Blue -->

function myFunction(evn) {
    var color = event.currentTarget.getAttribute('c_name');
    document.getElementById("paragraph").style.color = color;
   event.currentTarget.style.color = color;
}

在O(n ** 2)时要差得多。

答案 2 :(得分:0)

使用列表理解来尽可能地缩短答案。我敢肯定有一种方法可以将功能简化为一行。

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

这将输出以下内容:

{'excellent': ['bob', 'belle', 'baxter'], 'passing': ['barnum', 'bernice', 'bill', 'bernie'], 'satisfactory': ['beatrice'], 'no pass': ['ben']}