Форум сайта python.su
0
Вот как я решил аналогичную задачу, сортировка по первой букве
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 sorted(k[0].lower() for k in N)};
for k in D.keys():
print('-', k.upper(), '-', len(D[k]));
for v in D[k]:
print(v);
print();Отредактировано (Июль 29, 2011 14:09:57)
Офлайн
7
Второй sorted не имеет смысла, так как словарь в питоне не упорядочен.
То есть вот так:
D = {k:sorted(v for v in N if v[0]==k) for k in set(ch[0] for ch in N)}from collections import defaultdict
D = defaultdict(list)
for k in N: D[k[0]].append( k )
for l in D.values(): l.sort()
Отредактировано (Июль 29, 2011 16:00:58)
Офлайн
857
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)};
Офлайн
0
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()D = {k: tuple(v for v in N if v[0].lower() == k) for k in tuple(k[0].lower() for k in N)}Офлайн
857
не кортеджи, а кортежи
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D1%82%D0%B5%D0%B6
кортежи сохраняют одинаковые элементы
>>> N = ("print", "for", "if", "is",
... "try", "in", "sorted", "type", "range", "str",
... "pow", "len", "locals", "hash", "tuple")
>>> t = tuple(k[0].lower() for k in N)
>>> t
('p', 'f', 'i', 'i', 't', 'i', 's', 't', 'r', 's', 'p', 'l', 'l', 'h', 't')
>>>{k: sorted([v for v in N if v[0].lower() == k])Отредактировано (Июль 31, 2011 05:11:23)
Офлайн
0
Ясно, значит надо множества использовать?
D = {k: tuple(v for v in N if v[0].lower() == k) for k in set(k[0].lower() for k in N)}Офлайн