Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2013 18:53:33

sanya_rnd
Зарегистрирован: 2013-02-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция max()

n = int(input())
data = []
for x in range(0,n):
    data.append(input().split(" "))
num = [x for sublst in data for x in sublst if x.isdigit()]
print(max(set(num), key=num.count))

Суть:
дается n-е кол-во строк, из них нужно изъять число (пример строки: “abc A. B! 17”). Затем нужно посчитать, какое число самое популярное в списке и вывести его.

Вопрос. Каким образом работает max(set(num), key=num.count) ? Просто решение нашел, но в голове не укладывается принцип работы.

Офлайн

#2 Май 25, 2013 20:11:54

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

Функция max()

max “перебирает” элементы из итератора по множеству (set) применяет к ним num.count те вычисляет num.count(element). А это число раз которое в списке встречается element.Оно получается последовательным перебором списка. Далеко не самое быстрое и простое решение.
http://stackoverflow.com/questions/2161752/how-to-count-the-frequency-of-the-elements-in-a-list
Я буду считать что данные берутся из файла, в жизни никогда не видел чтобы кто-то эту ахинею руками вводил.

import collections
num=filter(lambda x:x.isdigit(),open("a.dat").read().split())
print(collections.Counter(num).most_common(1))



Отредактировано doza_and (Май 25, 2013 20:13:10)

Офлайн

#3 Май 25, 2013 21:59:41

sanya_rnd
Зарегистрирован: 2013-02-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция max()

doza_and
max “перебирает” элементы из итератора по множеству (set) применяет к ним num.count те вычисляет num.count(element). А это число раз которое в списке встречается element.Оно получается последовательным перебором списка. Далеко не самое быстрое и простое решение.http://stackoverflow.com/questions/2161752/how-to-count-the-frequency-of-the-elements-in-a-listЯ буду считать что данные берутся из файла, в жизни никогда не видел чтобы кто-то эту ахинею руками вводил.


Это задачи С4 из ЕГЭ. Формулировки “допустИм ввод из файла” нет, поэтому так. Т.е. по логике, зачем тогда нужен set(num), если key функции max перебирает все значения в num и так?

Офлайн

#4 Май 26, 2013 08:58:41

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

Функция max()

sanya_rnd
зачем тогда нужен
Он делает значения уникальными
set([1,1,2,1,2])->set(1,2)
. Это тоже своего рода оптимизация.
Нормально по эффективности и из примитивных средств подойдет вариант с defaultdict или его имитацией:
def II():
    while 1:
       for i in input().split():
          if i.isdigit()
              yield i
a={}
for i in II():
    if i in a:
       a[i]+=1
    else:
       a[i]=0
print(max(a.items(),key=lambda x:x[1]))

Я код не проверял - так набросал чтобы показать идею.



Отредактировано doza_and (Май 26, 2013 09:01:31)

Офлайн

#5 Май 26, 2013 09:31:28

sanya_rnd
Зарегистрирован: 2013-02-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция max()


doza_and
Он делает значения уникальными

Это ясно, но он, получается, сохраняет кол-во этих одинаковых элементов где-то в памяти?

Офлайн

#6 Май 26, 2013 16:20:45

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

Функция max()

sanya_rnd
сохраняет кол-во этих одинаковых элементов
Внутри set нет количества элементов. set организован как массив (доступ по индексам) но в нем могут быть большие дырки. Если в set второй раз добавить элемент, то ничего не произойдет, добавление как-бы игнорируется.
http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version