Anexar una Lista y Recursividad (Distancia de Hamming) - Python 3
-
23-12-2019 - |
Pregunta
Voy a escribir un programa que toma una cadena de código binario y un número, y las salidas de todas las cadenas en los que la distancia de hamming de la cadena original.Tengo una función que hace de todo, pero en la salida hay listas dentro de listas.Entiendo por qué esto es - la función es recursiva, y a veces se devolverá una lista de posibles valores.
El problema es que no sé cómo cambiarlo de manera que las salidas de cadenas completas.Por ejemplo, para una cadena de "0000" y la distancia de hamming "2", me sale:["1['100', '010', '001']", "01['10', '01']", "001['1']"]
Pero lo que yo quiero es:
1100
1010
1001
0110
0101
0011
El código es el siguiente:
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
Solución
Si el bucle a través de la lista devuelta por hamming
usted debe ser capaz de anexar las cadenas juntos de la manera correcta - como este:
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
Otros consejos
Puede solucionarlo devolviendo [num]
en lugar de que num
en el caso base, y en un caso general, combine los resultados de las llamadas recursivas utilizando map
y extend
en lugar de 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']
>>>