Форум сайта python.su
0
Доброго времени суток!
Недавно разбирал задачу определения наиболее встречающейся в тексте буквы и наткнулся на решение:
import string def checkio(text): """ We iterate through latyn alphabet and count each letter in the text. Then 'max' selects the most frequent letter. For the case when we have several equal letter, 'max' selects the first from they. """ text = text.lower() return max(string.ascii_lowercase, key=text.count)
Офлайн
253
как это нет информации?
>>> print max.__doc__ max(iterable[, key=func]) -> value max(a, b, c, ...[, key=func]) -> value With a single iterable argument, return its largest item. With two or more arguments, return the largest argument. >>>
Офлайн
0
doza_and,
Непонятно что возвращает text.count, и почему без скобок написана? и как в данном случае сравнение идет с алфавитом? т.е. посимвольно?
Офлайн
221
EvgenKlim
без скобок потому что передается именно объект функции,а не результат ее выполнения. Функция max будет внутри себя вызывать передаваемую функцию.
Например
a=range(5) b=range(10,15) c=range(5,10) print max(a,b,c, key=lambda x: x[1]) результат: [10, 11, 12, 13, 14]
Офлайн
0
JOHN_16,
в Вашем примере все понятно.
в данном случае “max(string.ascii_lowercase, key=text.count)” здесь один аргумент - строка текста ‘abcd…xyz’, другой - функция text.count, причем text - это строка, а у строки нет метода Count, он есть у списков. и что возвращает эта функция text.count непонятно…
Можете посоветовать какуюн хорошую книгу или сайт где можно ознакомиться с функцией max()?
Офлайн
1
Для примера, как работает count:
>>> 'aabccc'.count('a')
2
>>> 'aabccc'.count('b')
1
>>> 'aabccc'.count('c')
3max(string.ascii_lowercase, key=text.count)
text.count('a'), text.count('b'), ..., text.count('z')Офлайн
0
mgk,
Спасибо!!!!
Спасибо всем за помощь!!!
Офлайн
857
EvgenKlimВот это главное заблуждение, у строки есть метод .count()
text - это строка, а у строки нет метода Count, он есть у списков
dir('')
EvgenKlimА само решение не хорошее, ввиду того что при каждом .count() он будет проходить всю строку. Получается, если в строке миллион символов, он будет миллион раз проходить по миллиону символов.
Недавно разбирал задачу определения наиболее встречающейся в тексте буквы и наткнулся на решение:
Отредактировано py.user.next (Май 28, 2014 23:19:40)
Офлайн
0
py.user.next
наверно я неправильно записывал, что ошибка появлялась.
а как еще можно определить частоту буквы? в любом случае придется проходить всю строку.
я лично делал через Counter, но это еще дольше. Сортировка нужна, т.к. если например слово “bca”, то ответ = ‘a’, т.е. при равной частоте вывод по алфавиту
import re from collections import Counter s="One" st=re.compile('[a-zA-Z]') def checkio(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]
return max(set(text), key=text.count)
Офлайн
221
EvgenKlimглубоко заблуждаетесь, set это множества, вот вам для примера:
предварительно text очистили от небукв.
>>> set('aaabcbc') set(['a', 'c', 'b'])
Офлайн