【问题标题】:Run Length Encoding Python运行长度编码 Python
【发布时间】:2017-10-04 18:43:25
【问题描述】:

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

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

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

【问题讨论】:

  • 请显示您的代码(请不要显示您的代码的屏幕截图)。
  • 修复了@birryree
  • 是什么让您认为“它不会遍历列表的整个长度”以获得更长的列表?您是否有任何失败的列表的具体示例?您观察到哪些具体行为让您认为它没有遍历整个输入?
  • 现在我看到了代码,它与您之前的问题和答案有何不同? stackoverflow.com/questions/46555516/run-length-encoding-python - 你的代码有什么问题?你能展示一些示例输入以及它会发生什么吗?

标签: python


【解决方案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)
    ))

【讨论】:

  • 您的回答似乎过于复杂。如果myList 不为空,则count 在循环终止时将始终有效。因此,对原始代码的一个简单修复是将最后三行移出循环,并将它们替换为if len(myList) > 0: aList.append(myList[-1]); aList.append(count)
  • PS:测试 if count > 1 将失败单个终止字符(例如 "a""abc"
  • @ekhumoro 如果您保留原始的最后 3 行,则不会。
  • 即使这样,"a" 也会失败。
  • 是的,因为range(1, 1) 是空的。将您的建议添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 2013-09-27
  • 1970-01-01
  • 2013-02-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多