Вы можете использовать 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']})
>>>