Самая длинная последовательность последовательных дубликатов в списке питонов - PullRequest
0 голосов
/ 28 октября 2018

Как уже упоминалось, прогон представляет собой последовательность последовательных повторяющихся значений. Реализуйте функцию Python с именем longest_run, которая принимает список чисел и возвращает длину самого длинного прогона. Например, в последовательности: 2, 7, 4, 4, 2, 5, 2, 5, 10, 12, 5, 5, 5, 5, 6, 20, 1 самый длинный пробег имеет длину 4. Затем, в основном, ваша программа должна попросить пользователя ввести список, затем она должна вызвать функцию longest_run и вывести результат.

Это то, что я пытался, но он возвращает только 1, и я не понимаю, почему. Я не могу импортировать какие-либо модули для этого вопроса.

def longest_run(aList):
  '''(list)->int
  Returns length of the longest run
  Precondition: aList is a list of a len of at least 2 and elements of list are ints
  '''
  count=0
  bucket=[]
  for i in aList:
    if bucket==i:
        count=count+1
    else:
        bucket=i
        count=1
  return count

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Самая большая ошибка вашего кода - установить bucket=[] (который является списком), а затем - целое число.

Кроме того, вам нужно сохранить самую длинную последовательность и текущую длину последовательности (инициализированную как1) и последнее увиденное значение, поэтому больше переменных, чем вы храните.

Каждый раз значение такое же, как и раньше, увеличьте счетчик.Если он отличается, сбросьте счетчик после проверки, не превышает ли он макс.В конце выполните макс тест снова, на случай, если самая длинная последовательность в конце (классическая ошибка)

примерно так:

seq = [2, 7, 4, 4, 2, 5, 2, 5, 10, 12, 5, 5, 5, 5, 6, 20, 1]

result=1
max_result=0
last_seen=seq[0]

for v in seq[1:]:
    if v==last_seen:
        result += 1
    else:
        if result > max_result:
            max_result = result
        last_seen = v
        result = 1

# just in case the longest sequence would be at the end of your list...
if result > max_result:
    max_result = result

print(max_result)

Когда вам наконец разрешат использовать батареи питона, используйте itertools.groupby и вычислите максимальную длину последовательностей:

max(sum(1 for x in v) for _,v in itertools.groupby(seq))
0 голосов
/ 28 октября 2018

Вы получаете 1, поскольку, когда ваш цикл находится на последней итерации: bucket = 20 и i = 1, что означает bucket! = i, поэтому цикл входит в предложение else и назначает count = 1 выходы, афункция возвращает количество, равное 1.

Предложения:

1) Если вы столкнулись с такой ошибкой, попробуйте выполнить код / ​​логику вручную - это поможет.

2)В частности, для этого вопроса: всякий раз, когда цикл заканчивается, вы забываете последнюю длину цикла, подумайте о том, как вы можете «запомнить» самый длинный цикл.

0 голосов
/ 28 октября 2018

То есть вы пытаетесь найти самый длинный прогон с тем же номером в вашем списке?Потому что это немного сбивает с толку то, что вы пытались закодировать.

Вы должны сохранить две версии счета: maxCount (тот, который вы собираетесь вернуть) и actualCount (тот, который вы собираетесьувеличить), перебрать список и сравнить число со следующим.Если это то же самое actualCount += 1, если нет, actualCount = 0 в конце каждой итерации, сравните maxCount и actualCount, и если actualCount больше maxCount = actualCount.

def longest_run(aList):

    maxCount = 1
    actualCount = 1

    for i in range(len(aList)-1):
        if aList[i] == aList[i+1]:
            actualCount += 1
        else:
            actualCount = 1
        if actualCount > maxCount:
            maxCount = actualCount

    return(maxCount)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...