执行给定任务的代码时,我会继续获取最长的字符串以及迭代中的下一个字母。例如,如果我使用
s = 'azcbobobegghakl'
当答案应为"beggha"
时,我会将"beggh"
作为最长的字符串。我试过的所有随机字母串都会出现同样的错误。
我已经发现在“结果+ =字母”声明后添加了额外的字母,但我不知道如何修复它。这是我的代码:
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)
答案 0 :(得分:2)
这里的问题是result
和final
指向同一个列表。
您可能认为+=
会在发出result += letters
时创建新列表,但不会:
>>> x = [1,2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x is y
True
但是,当您使用x = x + [3]
:
>>> x = [1,2]
>>> y = x
>>> x = x + [3]
>>> x
[1, 2, 3]
>>> y
[1, 2]
>>> x is y
False
有关此行为的说明,请参阅this问题。当for
是字符串中的最后一个letters
字符时,a
循环(编辑原始代码)就会发生这种情况:
final
和result
都指向['b', 'e', 'g', 'g', 'h']
。result += 'a'
final
和result
之后都指向['b', 'e', 'g', 'g', 'h', 'a']
。elif
块,结果将指向新列表['a']
,而final
仍然指向['b', 'e', 'g', 'g', 'h', 'a']
。final
将永远不会再次更新
醇>
因此,您可以通过更改
来修复原始代码(编辑之前) result += letters
到
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)
答案 1 :(得分:1)
您有几件要解决的问题。首先是当你使用...时
final = result
这不仅仅是将结果中的值分配给final。它指出变量' final'到包含'结果'的列表的内存地址也指着。那么如果结果发生变化,那么最终结果也是如此。要在结果中指定值,请使用...
final = result[:]
将从头到尾为您提供列表片段的值。或者你可以使用......
final = list(result)
在更改之后,您需要删除elif语句中的长度比较。
编辑代码:
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)