пустой. Добавлю ваше предложение в мой ответ.

с задается: напишите функцию, которая принимает в качестве аргумента список символов и возвращает список, отражающий кодировку длины списка в этом списке. Элементы в возвращаемом списке следуют следующему шаблону: четные индексы содержат символы, а нечетные индексы содержат количество повторений символа подряд.

Когда я набираю список в функцию, он не проходит по всей длине списка. Он будет работать для списков более коротких, но не для более длинных. Не знаю, как это исправить.

def runLengthEncoding(myList):
    aList=[]
    count=1
    for i in range(1,len(myList)):
        if myList[i] == myList[i-1]:
            count=count+1
        else:
            aList.append(myList[i-1])
            aList.append(count)
            count=1
            if i == (len(myList)-1):
                aList.append(myList[i])
                aList.append(count)
    return aList
 wkl04 окт. 2017 г., 20:49
Теперь, когда я вижу код, чем он отличается от вашего предыдущего вопроса и ответа?stackoverflow.com/questions/46555516/run-length-encoding-python - что не работает с вашим кодом? Можете ли вы показать пример ввода и что с ним происходит?
 Ellie Paul04 окт. 2017 г., 20:47
Исправлено @birryree
 wkl04 окт. 2017 г., 20:45
Пожалуйста, покажите свой код (и, пожалуйста, не показывайтескриншот вашего кода).
 user235711204 окт. 2017 г., 20:49
Что заставляет вас думать, что «он не перебирает всю длину списка» для более длинных списков? У вас есть конкретные примеры списков, на которых он не работает? Какое специфическое поведение вы наблюдали, что заставило вас думать, что оно не повторяет весь ввод?

Ответы на вопрос(1)

когда последние элементы повторяются или когда длина списка равна 1:

>>> runLengthEncoding("fooobar")
['f', 1, 'o', 3, 'b', 1, 'a', 1, 'r', 1]
>>> runLengthEncoding("fooobarr")
['f', 1, 'o', 3, 'b', 1, 'a', 1]
>>> runLengthEncoding("a")
[]

Решением для вашего решения было бы удалить три строки, начинающиеся сif i == (len(myList)-1): и заменить их

if myList:
    aList.append(myList[-1])
    aList.append(count)

Переместите этот блок за пределы цикла.

Однако самый простой способ реализовать кодировку длины прогона, вероятно, был бы с модулем itertools:

from itertools import chain, groupby

def run_length(iterable):
    return list(chain.from_iterable(
        (val, len([*thing]))
        for val, thing in groupby(iterable)
    ))
 ekhumoro04 окт. 2017 г., 22:43
Даже с этим, это не удастся для"a".
 L3viathan04 окт. 2017 г., 22:29
@ekhumoro Нет, если вы сохраните оригинальные последние 3 строки.
 L3viathan04 окт. 2017 г., 22:46
Правда, потому чтоrange(1, 1) пустой. Добавлю ваше предложение в мой ответ.
 ekhumoro04 окт. 2017 г., 21:58
Ваш ответ кажется слишком сложным. ЕслиmyList не пусто, тоcount всегда будет действительным, когда цикл завершится. Таким образом, простое исправление исходного кода состоит в том, чтобы переместить последние три строки из цикла и заменить их наif len(myList) > 0: aList.append(myList[-1]); aList.append(count).
 ekhumoro04 окт. 2017 г., 22:04
PS: тестif count > 1 потерпит неудачу для одиночных завершающих символов (например,"a" или же"abc")

Ваш ответ на вопрос