encontrar la subcadena más larga de letras en orden alfabético en una cadena dada

Al ejecutar mi código para la tarea dada, sigo obteniendo la cadena más larga y la siguiente letra de la iteración. Por ejemplo, si uso

s = 'azcbobobegghakl' 

"beggha" como la cadena más larga, cuando se supone que la respuesta es "beggh" . Este mismo error se produce para todas las cadenas de letras aleatorias que he intentado.

Me he dado cuenta de que la letra adicional se agrega después de la statement “resultado + = letras”, pero no estoy seguro de cómo solucionarlo. Aquí está mi código:

 s = 'azcbobobegghakl' result = [] final = [] for letters in s: result += letters if result == sorted(result) and len(result) >= len(final): final=result elif result != sorted(result): result = [result[len(result)-1]] print "".join(final) 

    El problema aquí es que el result y el punto final a la misma lista. Probablemente esté pensando que += creará una nueva lista cuando emita el result += letters , pero no lo hará:

     >>> x = [1,2] >>> y = x >>> x += [3] >>> x [1, 2, 3] >>> y [1, 2, 3] >>> x is y True 

    Sin embargo, cuando usas x = x + [3] :

     >>> x = [1,2] >>> y = x >>> x = x + [3] >>> x [1, 2, 3] >>> y [1, 2] >>> x is y False 

    Para una explicación de este comportamiento, vea esta pregunta. Esto es lo que está sucediendo en su bucle for (edición: de su código original) cuando las letters son el último carácter de su cadena:

    1. al principio, final y result ambos apuntan a ['b', 'e', 'g', 'g', 'h'] .
    2. después de result += 'a' final y el result ambos apuntan a ['b', 'e', 'g', 'g', 'h', 'a'] .
    3. ahora se ingresa al bloque elif y el resultado apuntará a una nueva lista ['a'] , mientras que los puntos final fijos a ['b', 'e', 'g', 'g', 'h', 'a'] .
    4. final nunca se actualizará de nuevo después de esto.

    Por lo tanto, su código original (antes de editarlo) se puede corregir cambiando

    result += letters

    a

    result = result + [letters] :

     s = 'azcbobobegghakl' result = [] final = [] for letters in s: result = result + [letters] if result == sorted(result) and len(result) >= len(final): final=result elif result != sorted(result): result = [result[len(result)-1]] print(final) 

    Tienes un par de artículos para abordar. La primera es que cuando usas …

     final = result 

    Esto no es solo asignar los valores en el resultado a final. Apunta la variable ‘final’ a la dirección de memoria que contiene la lista a la que ‘resultado’ también apunta. Entonces, si el resultado es cambiado, también lo es el final. Para asignar los valores en el resultado, use …

     final = result[:] 

    que le dará los valores de una porción de la lista de principio a fin. O puedes usar …

     final = list(result) 

    Después de ese cambio, deberá eliminar la comparación de longitud en su statement elif.

    Código editado:

     s = 'azcbobobegghakl' result = [] final = [] for letters in s: result += letters if result == sorted(result) and len(result) >= len(final): final = list(result) elif result != sorted(result): result = [result[len(result)-1]] print "".join(final)