运行长度编码Python

运行长度编码Python,python,Python,问题是:编写一个函数,将字符列表作为参数,并返回一个反映该列表运行长度编码的列表。返回列表中的元素遵循以下模式:偶数索引包含字符,奇数索引包含字符连续重复的次数 当我在函数中键入一个列表时,它不会遍历列表的整个长度。它适用于长度较短的列表,但不适用于长度较长的列表。不知道如何修复它 def runLengthEncoding(myList): aList=[] count=1 for i in range(1,len(myList)): if myList

问题是:编写一个函数,将字符列表作为参数,并返回一个反映该列表运行长度编码的列表。返回列表中的元素遵循以下模式:偶数索引包含字符,奇数索引包含字符连续重复的次数

当我在函数中键入一个列表时,它不会遍历列表的整个长度。它适用于长度较短的列表,但不适用于长度较长的列表。不知道如何修复它

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

当最后一项重复或列表长度为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")
[]
解决方案的一个修复方法是删除以
开头的三行,如果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)
    ))

请显示您的代码(请不要显示代码的屏幕截图)。修复了@BirryRee对于较长的列表,您认为“它不会遍历整个列表长度”的原因是什么?你有没有它失败的具体例子?您观察到的哪些具体行为使您认为它没有遍历整个输入?现在我看到了代码,它与您之前的问题和答案有何不同哪些代码不起作用?你能展示一些输入的例子吗?你的答案似乎太复杂了。如果
myList
不为空,则循环终止时
count
将始终有效。因此,对原始代码的一个简单修复是将最后三行移出循环,并用
if len(myList)>0:aList.append(myList[-1])替换它们;aList.append(count)
.PS:如果count>1,则测试
对于单个终止字符(例如
“a”
“abc”
)@ekhumoro如果保留原来的最后3行,则测试将失败。即使如此,对于
“a”
。True,因为
范围(1,1)
为空。我会在我的回答中加入你的建议。