Добавление списка и рекурсия (расстояние Хэмминга) - Python 3
-
23-12-2019 - |
Вопрос
Предполагается, что я напишу программу, которая принимает строку двоичного кода и число и выводит все строки в пределах этого расстояния Хэмминга от исходной строки.У меня есть функция, которая делает все, но на выходе есть списки внутри списков.Я понимаю, почему это так - функция рекурсивна, и иногда она возвращает список возможных значений.
Проблема в том, что я не знаю, как изменить его, чтобы он выводил полные строки.Например, для строки "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']
>>>