Найти - Пользователи
Полная версия: Функция max()
Начало » Python для новичков » Функция max()
1
sanya_rnd
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) ? Просто решение нашел, но в голове не укладывается принцип работы.
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
Я буду считать что данные берутся из файла, в жизни никогда не видел чтобы кто-то эту ахинею руками вводил.
import collections
num=filter(lambda x:x.isdigit(),open("a.dat").read().split())
print(collections.Counter(num).most_common(1))
sanya_rnd
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 и так?
doza_and
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]))

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

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

Это ясно, но он, получается, сохраняет кол-во этих одинаковых элементов где-то в памяти?
doza_and
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB