py.user.next
atomAltera
Не знаю правда на сколько он быстрый
D = {k: sorted([v for v in N if v[0].lower() == k]) for k in sorted(k[0].lower() for k in N)};
пересоздаются списки
например, для слов if и is будет составляться один и тот же список
По-моему это происходит следующим образом:
N = ("print", "for", "if", "is",
"try", "in", "sorted", "type", "range", "str",
"pow", "len", "locals", "hash", "tuple")
#D = {k: sorted([v for v in N if v[0].lower() == k]) for k in (k[0].lower() for k in N)}
keys = tuple(k[0] for k in N)
D = {k: [v for v in N if v[0] == k] for k in keys}
for k in D.keys():
print(k, '-', len(D[k]))
for v in D[k]:
print(v)
print()
Сначала создаётся список ключей
keys, а потом словарь
D, для которого ключ берётся из
keys а значение - список (ну можно и картедж) тех элементов в исходном списке которые попадают пот ключ
k.
В коде исходное выражение закоментированно и заменено на 2 следующих.
А в чём проблема собственно? Как оптимизировать, ну разве что заменить списки на кортеджи?
D = {k: tuple(v for v in N if v[0].lower() == k) for k in tuple(k[0].lower() for k in N)}