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
¿Fue útil?

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']
>>> 

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top