Добавление списка и рекурсия (расстояние Хэмминга) - Python 3

StackOverflow https://stackoverflow.com//questions/22072112

Вопрос

Предполагается, что я напишу программу, которая принимает строку двоичного кода и число и выводит все строки в пределах этого расстояния Хэмминга от исходной строки.У меня есть функция, которая делает все, но на выходе есть списки внутри списков.Я понимаю, почему это так - функция рекурсивна, и иногда она возвращает список возможных значений.

Проблема в том, что я не знаю, как изменить его, чтобы он выводил полные строки.Например, для строки "0000" и расстояния Хэмминга "2" я получаю:["1['100', '010', '001']", "01['10', '01']", "001['1']"]

Но чего я хочу, так это:

1100
1010
1001
0110
0101
0011

Код приведен ниже:

def hamming(num, dist):
    if dist == 0:
        return num
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.append(num[:item] + "1" + str(restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.append(num[:item] + "0" + str(restoflist))                
        return outputlist
Это было полезно?

Решение

Если вы пишите через список, который возвращается hamming, вы должны сможете добавить строки вправо - подобное это:

def hamming(num, dist):
    if dist == 0:
        return num
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    if type(restoflist) is not str
                        for rest in restoflist:
                            outputlist.append(num[:item] + "1" + str(rest))
                    else
                        outputlist.append(num[:item] + "1" + str(restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    if type(restoflist) is not str
                        for rest in restoflist:
                            outputlist.append(num[:item] + "0" + str(rest))
                    else
                        outputlist.append(num[:item] + "0" + str(restoflist))                
    return outputlist
.

Другие советы

Вы можете исправить это, вернув [num] скорее, это num в базовом случае и в общем случае объединяйте результаты рекурсивных вызовов, используя map и extend скорее, чем append:

def hamming(num, dist):
    if dist == 0:
        return [num]
    else:
        outputlist = list()
        for item in range(len(num)):
            if len(num[item:]) > dist - 1:
                if num[item] == "0":
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.extend(map(lambda x: num[:item] + "1" + x, restoflist))
                else:
                    restoflist = hamming(num[item + 1:], dist - 1)
                    outputlist.extend(map(lambda x: num[:item] + "0" + x, restoflist))                
        return outputlist

>>> hamming('0000', 2)
['1100', '1010', '1001', '0110', '0101', '0011']
>>> 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top