2016-03-08 2 views
2

Я работаю над проблемой домашней работы и имею функцию compress(S), которая принимает двоичную строку. Он вызывает другую функцию, count(S), которая возвращает число последовательных цифр в начале строки. Он рекурсивно вызывает count(S) для всей строки и создает список из числа последовательных цифр. Например, compress('111000111') вернется [3, 3, 3].Ошибка неупорядоченных типов при использовании функции карты

Затем вызывается другая функция, reduction(n), которая принимает int и возвращает список, в котором ни одно из чисел больше заданного значения, COMPRESSED_BLOCK_SIZE. Он также чередуется с 0s, если число должно быть разделено. Например, reduction(5) возвращает [2, 0, 2, 0, 1], если COMPRESSED_BLOCK_SIZE равно 2.

Это мой код.

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(). Значения в списке значений - это int, поэтому я не понимаю, почему я получаю эту ошибку, если карта должна перебирать по списку int при вызове reduction.

Спасибо!

+0

Я использую встроенную функцию карты, чтобы вызвать «сокращение» для каждого int в моих «значениях». Он вызывается в функции сжатия. –

+0

'map (уменьшение, значения)' собирается вернуть список результатов 'reduce()' для каждого элемента в 'values'. Это означает, что у вас будет список списков целых чисел. Вы должны сгладить результат –

ответ

2

Сообщение об ошибке сообщает вам («unorderable types: list() < = int()»), python не может заказать список и int. В какой-то момент reduction() называется и n является list и COMPRESSED_BLOCK_SIZE является int. Если вы не можете понять, почему и где это происходит, попробуйте положить в некоторых заявлениях для печати, чтобы увидеть, что 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 
Смежные вопросы