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:
final
y result
ambos apuntan a ['b', 'e', 'g', 'g', 'h']
. result += 'a'
final
y el result
ambos apuntan a ['b', 'e', 'g', 'g', 'h', 'a']
. elif
y el resultado apuntará a una nueva lista ['a']
, mientras que los puntos final
fijos a ['b', 'e', 'g', 'g', 'h', 'a']
. 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)