2016-03-08 45 views
2

我正在處理作業問題,並且有一個函數compress(S),它使用二進制字符串。它調用另一個函數,count(S),它返回字符串開頭的連續數字的位數。它遞歸地調用count(S)作爲整個字符串,並創建連續數字的列表。例如,compress('111000111')會返回[3,3,3]。使用地圖功能時出現無法編輯的類型錯誤

然後調用另一個函數reduction(n),它接受int並返回一個列表,其中沒有一個數字大於設置值COMPRESSED_BLOCK_SIZE。如果數字必須分開,它也與0交替。例如,如果COMPRESSED_BLOCK_SIZE爲2,則reduction(5)返回[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)功能使用地圖函數調用reduction(values),我得到一個錯誤:unorderable類型:列表()< = INT()。值列表中的值是整數,所以我不明白爲什麼我會在調用reduction時出現此錯誤,如果映射應該遍歷整數列表。

謝謝!

+0

我正在使用內置的map函數在列表'values'中對每個int調用'reduction'。它在壓縮函數中被調用。 –

+0

'map(reduction,values)'將返回'values'中每個元素的'reduction()'結果列表。這意味着你將有一個整數列表的列表。你需要把結果弄平 –

回答

2

錯誤消息告訴你(「unorderable types:list()< = int()」),python無法排序列表和int。在某個點reduction()調用和nlistCOMPRESSED_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 
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 [] 
    c = count(S) 
    values = [c] + compress(S[c:]) 
    red_vals = sum(map(reduction, values), []) 
    return red_vals 
相關問題