Уведомления

Группа в Telegram: @pythonsu

#1 Май 28, 2014 06:11:30

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Синтакс функции max()

Доброго времени суток!

Недавно разбирал задачу определения наиболее встречающейся в тексте буквы и наткнулся на решение:

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)

Понятно, что функция сравнивает неск аргументов и выбирает максимальное из них. Но по факту - как используется key? Смотрел много примеров, везде по разному, единого правила не нашел. В интернете нет описания этой функции, кроме стандартного, в котором ничего про key не сказано.

В данном случае получается мы сравниваем алфавит ‘abcdef…xyz’ с текстом # “Lorem ipsum dolor sit amet”. Т.е. первый аргумент - алфавит, 2й - буква в тексте. Хотя опять же непонятно как здесь сравнение идет побуквенно и непонятна запись “key=text.count”. У функции Count другой вобще синтаксис - Count(что считать). Но здесь text.count все по-другому.

И, допустим сравниваем алфавит с 5 буквами ‘a’(посчитал Count). В данном случае почему выберется максимальное ‘a’?
Вобщем не могу понять как работает это решение, а оно работает.

Помогите пожалуйста разобраться.

Офлайн

#2 Май 28, 2014 07:05:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Синтакс функции max()

как это нет информации?

>>> 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.
>>> 
key это функция которая по объекту возвращает значение которое подлежит сравнению.



Офлайн

#3 Май 28, 2014 07:19:00

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Синтакс функции max()

doza_and,

Непонятно что возвращает text.count, и почему без скобок написана? и как в данном случае сравнение идет с алфавитом? т.е. посимвольно?

Офлайн

#4 Май 28, 2014 07:28:36

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Синтакс функции max()

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]
Здесь функция max принимает на входе 3 списка, а с помощью key мы определяем функцию (анонимная=лямбда) которая заставляет max сравнивать списки по второму элементу каждого из них.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Май 28, 2014 08:17:51

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Синтакс функции max()

JOHN_16,

в Вашем примере все понятно.

в данном случае “max(string.ascii_lowercase, key=text.count)” здесь один аргумент - строка текста ‘abcd…xyz’, другой - функция text.count, причем text - это строка, а у строки нет метода Count, он есть у списков. и что возвращает эта функция text.count непонятно…

Можете посоветовать какуюн хорошую книгу или сайт где можно ознакомиться с функцией max()?

Офлайн

#6 Май 28, 2014 08:47:09

mgk
Зарегистрирован: 2014-05-27
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Синтакс функции max()

Для примера, как работает count:

>>> 'aabccc'.count('a')
2
>>> 'aabccc'.count('b')
1
>>> 'aabccc'.count('c')
3

Дальше. Разбираем строку:
max(string.ascii_lowercase, key=text.count)
1. Для каждого элемента из string.ascii_lowercase, т.е. для каждой латинской буквы, будет вызываться функция, которая указана в параметре key, т.е.
text.count('a'), text.count('b'), ..., text.count('z')
.
2. Из тех значений, которые возвращает функция text.count для каждой буквы уже и ищется максимальное значение.
Вот и получается, что функция в итоге возвращает наибольшее количество вхождения одной буквы из всего латинского алфавита.

Офлайн

#7 Май 28, 2014 09:40:09

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Синтакс функции max()

mgk,
Спасибо!!!!

Спасибо всем за помощь!!!

Офлайн

#8 Май 28, 2014 23:14:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Синтакс функции max()

EvgenKlim
text - это строка, а у строки нет метода Count, он есть у списков
Вот это главное заблуждение, у строки есть метод .count()
dir('')

EvgenKlim
Недавно разбирал задачу определения наиболее встречающейся в тексте буквы и наткнулся на решение:
А само решение не хорошее, ввиду того что при каждом .count() он будет проходить всю строку. Получается, если в строке миллион символов, он будет миллион раз проходить по миллиону символов.



Отредактировано py.user.next (Май 28, 2014 23:19:40)

Офлайн

#9 Май 29, 2014 06:33:51

EvgenKlim
Зарегистрирован: 2014-05-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Синтакс функции max()

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)

предварительно text очистили от небукв.

Офлайн

#10 Май 29, 2014 07:08:03

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Синтакс функции max()

EvgenKlim
предварительно text очистили от небукв.
глубоко заблуждаетесь, set это множества, вот вам для примера:
>>> set('aaabcbc')
set(['a', 'c', 'b'])



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version