Найти - Пользователи
Полная версия: Вывод наиболее часто вречающегося значения в списке
Начало » Python для новичков » Вывод наиболее часто вречающегося значения в списке
1
kozlo22
Из списка с разными значениями необходимо вывести то, которое встречается чаще всего.
Мне приходит на ум лишь одна идея: взять за этало первую строку и сравнивать ее с остальными, если есть совпадение, то увеличивать значение счетчика на единицу. По окончании итерации записывать значение счетчика в словарь, ключом будет строка, которая использовалась на данной итерации. После прохождения всего списка сравнивать значения в словаре. Самое большое значение и будет ответом, точнее его ключ.
Но мне кажется, что есть решение красивее.
bismigalis
это такая частая операция что в питоне есть встроенное решение
http://docs.python.org/2/library/collections.html#collections.Counter

EDIT: правильно рассуждаешь, что нужен словарь, только сравнивать не нужно
kozlo22
bismigalis
я почти был уверен в этом.
Спасибо, что ткнули.
wbt
import collections
d = [1,2,3,4,5,1,1,1,2]
print (collections.Counter(d).most_common(1)
py.user.next
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]
>>>
4kpt
>>> t1.repeat(3)
[2.065266342000541, 2.0754058879992954, 2.0760085520005305]
>>> t2.repeat(3)
[18.191875282000183, 18.18951354299952, 18.22875203500007]
>>>
Ох ты елки зеленые.
Никогда бы не подумал.
Singularity
py.user.next
я так и не понял почему он медленней http://hg.python.org/cpython/file/2.7/Lib/collections.py#l387
py.user.next
Singularity
я так и не понял почему он медленней
вообще, он использует два прохода: сначала подсчитывает элементы, а потом ищет максимальное количество
но это замедляет в два раза
остальное, похоже, ушло на всякие инициализации и дополнительные вызовы
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