我有一个字典,我创建了一个函数,该函数接受每个相同的值,并使用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']}
答案 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']}