Форум сайта python.su
857
EvgenKlimЭто ближе к нормальному, но тоже .count() будет проходить по тексту в миллион символов несколько раз.
видел также такое решение
EvgenKlimОн правильно делает, но долго. Так как он общий, там всё учитывается, даже то, что не надо.
я лично делал через Counter, но это еще дольше
EvgenKlim
Сортировка нужна, т.к. если например слово “bca”, то ответ = ‘a’, т.е. при равной частоте вывод по алфавиту
>>> import string >>> >>> def f(s): ... d = {} ... for c in s: ... if c in string.ascii_lowercase: ... d[c] = d.get(c, 0) + 1 ... m = max(d.values()) ... return sorted(k for k in d if d[k] == m)[0] ... >>> f('dcba dcba efgh') 'a' >>>
Офлайн
0
JOHN_16
нет, я имел ввиду что перед выполнением return max(set(text), key=text.count)
text очистили, т.е. в переменной text содержался уже только текст без цифр и пр знаков. а после выполнения set остались только те буквы которые есть в тексте, т.е не весь алфавит целиком.
Офлайн
221
EvgenKlim
Если все всем все будут выражаться более конкретно и корректно во всем мире атрофируется недопонимание. Я за. И да это легкий намек ;)
Офлайн
0
JOHN_16
text = ''.join(i for i in text.lower() if i.isalpha())
return max(set(text), key=text.count)
Офлайн
857
Сравнил по времени: самый первый вариант - самый быстрый. Скорее всего, ввиду того что сишная реализация используется. Самый медленный, как и ожидалось, - с Counter'ом. А два варианта не работают, так как там нет сортировки символов (выдают первый встретившийся). Добавление сортировки замедлит скорость.
Сравнивал эти:
import string def checkio1(text): text = text.lower() return max(string.ascii_lowercase, key=text.count) import re from collections import Counter st=re.compile('[a-zA-Z]') def checkio2(text): ns="" for i in text: if st.match(i): ns+=i ns=ns.lower() ns=list(ns) ns.sort() d=Counter(ns).most_common(1) return d[0][0] def checkio3(text): return max(set(text), key=text.count) import string def checkio4(s): d = {} for c in s: if c in string.ascii_lowercase: d[c] = d.get(c, 0) + 1 m = max(d.values()) return sorted(k for k in d if d[k] == m)[0]
Отредактировано py.user.next (Май 30, 2014 09:46:11)
Офлайн