我正在处理家庭作业问题,并且有一个采用二进制字符串的函数compress(S)。它调用另一个函数count(S),该函数返回字符串开头的连续位数。它递归调用整个字符串的count(S),并创建一个连续位数的列表。例如,compress('111000111')将返回[3,3,3]。

然后调用另一个函数reduction(n),该函数接受int并返回一个列表,其中所有数字均不大于设置值COMPRESSED_BLOCK_SIZE。如果必须分割数字,则它也以0交替。例如,如果reduction(5)为2,则COMPRESSED_BLOCK_SIZE返回[2,0,2,0,1]。

到目前为止,这是我的代码。

def count(S):
    if len(S) == 1:
        return 1
    if S[0] == S[1]:
        return 1 + count(S[1:])
    return 1

def reduction(n):
    if n <= COMPRESSED_BLOCK_SIZE:
        return [n]
    return [COMPRESSED_BLOCK_SIZE] + [0] + reduction(n-COMPRESSED_BLOCK_SIZE)

def compress(S):
    if S == '':
        return []
    values = [count(S)] + compress(S[count(S):])
    red_vals = list(map(reduction, values))
    return red_vals


归约函数正在运行,但是当compress(S)函数使用map函数调用reduction(values)时,出现错误:不可排序的类型:list()reduction时map应该迭代整数列表,为什么会出现此错误。

谢谢!

最佳答案

错误消息告诉您(“无序类型:list()reduction(),而nlist,而COMPRESSED_BLOCK_SIZEint。如果您看不到发生这种情况的原因或原因,请尝试输入一些打印语句以查看reduction()被调用的内容以及返回的内容:

def reduction(n):
    print(n)
    if n <= COMPRESSED_BLOCK_SIZE:
        retval = [n]
    else:
        retval = [COMPRESSED_BLOCK_SIZE] + [0] + reduction(n - COMPRESSED_BLOCK_SIZE)

    print(retval)
    return retval

09-28 08:49