Как вы рассчитываете наибольшее количество повторений в списке?

Если у меня есть список в Python, например

[1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]

Как рассчитать наибольшее количество повторов для любого элемента? В этом случае 2 повторяется максимум 4 раза, а 1 повторяется максимум 3 раза.

Есть ли способ сделать это, но также записать индекс, с которого начался самый длинный запуск?

Ответ 1

Используйте groupby, он группирует элементы по значению:

from itertools import groupby
group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
print max(group, key=lambda k: len(list(k[1])))

И вот код в действии:

>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
>>> print max(group, key=lambda k: len(list(k[1])))
(2, <itertools._grouper object at 0xb779f1cc>)
>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
>>> print max(group, key=lambda k: len(list(k[1])))
(3, <itertools._grouper object at 0xb7df95ec>)

Из документации python:

Операция groupby() аналогична к фильтру uniq в Unix. Это генерирует разрыв или новую группу каждый время значение ключевой функции изменения

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

Если вам нужен индекс самого длинного прогона, вы можете сделать следующее:

group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
result = []
index = 0
for k, g in group:
   length = len(list(g))
   result.append((k, length, index))
   index += length

print max(result, key=lambda a:a[1])

Ответ 2

Прокрутите список, отследите текущий номер, сколько раз он был повторен и сравните это с тем, сколько раз вы видели, что число повторяется.

Counts={}
Current=0
Current_Count=0
LIST = [1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
for i in LIST:
    if Current == i:
        Current_Count++
    else:
        Current_Count=1
        Current=i
    if Current_Count>Counts[i]:
        Counts[i]=Current_Count
print Counts

Ответ 3

Если вы хотите его для всего элемента (т.е. элемента с наибольшим количеством повторений), вы можете использовать:

def f((v, l, m), x):
    nl = l+1 if x==v else 1
    return (x, nl, max(m,nl))

maxrep = reduce(f, l, (0,0,0))[2];

Это означает только непрерывные повторения (результат для [1,2,2,2,1,2] будет 3) и записывает только элемент с максимальным числом.

Изменить. Сделано определение f немного короче...

Ответ 4

Это мое решение:

def longest_repetition(l):
    if l == []:
        return None

    element = l[0]
    new = []
    lar = []

    for e in l:            
        if e == element:
            new.append(e)
        else:
            if len(new) > len(lar):
                lar = new
            new = []
            new.append(e)
            element = e
    if len(new) > len(lar):
        lar = new    
    return lar[0]

Ответ 5

-Вы можете создать новую копию списка, но с уникальными значениями и соответствующим списком удалений.

-Тогда получите список Max of hits и получите от него индекс вашего наиболее повторяющегося элемента.

oldlist = ["A", "B", "E", "C","A", "C","D","A", "E"]
newlist=[]
hits=[]
for i in range(len(oldlist)):
    if oldlist[i] in newlist:
        hits[newlist.index(oldlist[i])]+= 1
    else:
        newlist.append(oldlist[i])
        hits.append(1);
#find the most repeated item
temp_max_hits=max(hits)
temp_max_hits_index=hits.index(temp_max_hits)
print(newlist[temp_max_hits_index])
print(temp_max_hits)

Но я не знаю, это самый быстрый способ сделать это или есть более быстрое решение. Если вы считаете, что есть более быстрое или более эффективное решение, сообщите нам об этом.

Ответ 6

Этот код работает:

l = [1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
previous = None

# value/repetition pair
greatest = (-1, -1)
reps = 1

for e in l:
    if e == previous:
        reps += 1
    else:
        if reps > greatest[1]:
            greatest = (previous, reps)

        previous = e
        reps = 1

if reps > greatest[1]:
    greatest = (previous, reps)

print greatest

Ответ 7

Я бы использовал hashmap элемента для счетчика.

Каждый раз, когда вы видите последовательность "ключ", увеличивайте его значение счетчика. Если вы нажмете новый элемент, установите счетчик равным 1 и продолжайте движение. В конце этого линейного поиска вы должны иметь максимальное количество подряд для каждого номера.