Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 30, 2013 19:10:15

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

Из списка с разными значениями необходимо вывести то, которое встречается чаще всего.
Мне приходит на ум лишь одна идея: взять за этало первую строку и сравнивать ее с остальными, если есть совпадение, то увеличивать значение счетчика на единицу. По окончании итерации записывать значение счетчика в словарь, ключом будет строка, которая использовалась на данной итерации. После прохождения всего списка сравнивать значения в словаре. Самое большое значение и будет ответом, точнее его ключ.
Но мне кажется, что есть решение красивее.

Отредактировано kozlo22 (Авг. 30, 2013 19:23:52)

Офлайн

#2 Авг. 30, 2013 19:23:25

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

это такая частая операция что в питоне есть встроенное решение
http://docs.python.org/2/library/collections.html#collections.Counter

EDIT: правильно рассуждаешь, что нужен словарь, только сравнивать не нужно

Отредактировано bismigalis (Авг. 30, 2013 19:27:10)

Офлайн

#3 Авг. 30, 2013 19:25:12

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

bismigalis
я почти был уверен в этом.
Спасибо, что ткнули.

Офлайн

#4 Авг. 31, 2013 02:09:52

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

import collections
d = [1,2,3,4,5,1,1,1,2]
print (collections.Counter(d).most_common(1)



Бейсик - не порок, Гвидо - не пророк

Офлайн

#5 Авг. 31, 2013 19:53:25

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

Вывод наиболее часто вречающегося значения в списке

def f(lst):
    elems = {}
    e, em = None, 0
    for i in lst:
        elems[i] = t = elems.get(i, 0) + 1
        if t > em:
            e, em = i, t
    return e

>>> import timeit
>>> import collections
>>> 
>>> def f1(lst):
...     elems = {}
...     e, em = None, 0
...     for i in lst:
...         elems[i] = t = elems.get(i, 0) + 1
...         if t > em:
...             e, em = i, t
...     return e
... 
>>> def f2(lst):
...     return collections.Counter(lst).most_common(1)[0][0]
... 
>>> t1 = timeit.Timer('f1([3, 5, 1, 2, 5])', 'from __main__ import f1')
>>> t2 = timeit.Timer('f2([3, 5, 1, 2, 5])', 'from __main__ import f2')
>>> t1.repeat(3)
[2.065266342000541, 2.0754058879992954, 2.0760085520005305]
>>> t2.repeat(3)
[18.191875282000183, 18.18951354299952, 18.22875203500007]
>>>



Офлайн

#6 Авг. 31, 2013 21:35:14

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

>>> t1.repeat(3)
[2.065266342000541, 2.0754058879992954, 2.0760085520005305]
>>> t2.repeat(3)
[18.191875282000183, 18.18951354299952, 18.22875203500007]
>>>
Ох ты елки зеленые.
Никогда бы не подумал.



Отредактировано 4kpt (Авг. 31, 2013 21:35:34)

Офлайн

#7 Сен. 1, 2013 18:52:24

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Вывод наиболее часто вречающегося значения в списке

py.user.next
я так и не понял почему он медленней http://hg.python.org/cpython/file/2.7/Lib/collections.py#l387

Офлайн

#8 Сен. 2, 2013 02:10:06

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

Вывод наиболее часто вречающегося значения в списке

Singularity
я так и не понял почему он медленней
вообще, он использует два прохода: сначала подсчитывает элементы, а потом ищет максимальное количество
но это замедляет в два раза
остальное, похоже, ушло на всякие инициализации и дополнительные вызовы



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version