Если вы не иррационально ;-) установлены на одну строку, это просто:
from collections import defaultdict
lst = [0,1,2,3,4]
f = lambda x: x % 3
d = defaultdict(list)
for x in lst:
d[f(x)].append(x)
print(list(d.values()))
отображает то, что вы хотите. f()
выполняется len(lst)
раз, что не может быть побито
РЕДАКТИРОВАТЬ: или, если необходимо:
from itertools import groupby
print([[pair[1] for pair in grp]
for ignore, grp in
groupby(sorted((f(x), x) for x in lst),
key=lambda pair: pair[0])])
Это не требует, чтобы f()
создавало значения, используемые в качестве ключей dict, но требует дополнительных затрат на сортировку и близко к непостижимому. Ясность гораздо более питонна, чем стремление к однострочности.