Форум сайта python.su
0
Из списка с разными значениями необходимо вывести то, которое встречается чаще всего.
Мне приходит на ум лишь одна идея: взять за этало первую строку и сравнивать ее с остальными, если есть совпадение, то увеличивать значение счетчика на единицу. По окончании итерации записывать значение счетчика в словарь, ключом будет строка, которая использовалась на данной итерации. После прохождения всего списка сравнивать значения в словаре. Самое большое значение и будет ответом, точнее его ключ.
Но мне кажется, что есть решение красивее.
Отредактировано kozlo22 (Авг. 30, 2013 19:23:52)
Офлайн
47
это такая частая операция что в питоне есть встроенное решение
http://docs.python.org/2/library/collections.html#collections.Counter
EDIT: правильно рассуждаешь, что нужен словарь, только сравнивать не нужно
Отредактировано bismigalis (Авг. 30, 2013 19:27:10)
Офлайн
0
bismigalis
я почти был уверен в этом. 
Спасибо, что ткнули. 
Офлайн
6
import collections d = [1,2,3,4,5,1,1,1,2] print (collections.Counter(d).most_common(1)
Офлайн
857
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] >>>
Офлайн
63
>>> t1.repeat(3) [2.065266342000541, 2.0754058879992954, 2.0760085520005305] >>> t2.repeat(3) [18.191875282000183, 18.18951354299952, 18.22875203500007] >>>
Отредактировано 4kpt (Авг. 31, 2013 21:35:34)
Офлайн
75
py.user.next
я так и не понял почему он медленней http://hg.python.org/cpython/file/2.7/Lib/collections.py#l387
Офлайн
857
Singularityвообще, он использует два прохода: сначала подсчитывает элементы, а потом ищет максимальное количество
я так и не понял почему он медленней
Офлайн