为什么我的 IF 语句不执行

Why does my IF Statement not execute

我正在做的练习的重点是编写一个程序来打印 s 的最长子字符串,其中字母按字母顺序出现。 例如,如果 s = 'azcbobobegghakl',那么你的程序应该打印:

Longest substring in alphabetical order is: beggh

在并列的情况下,打印第一个子字符串。例如,如果 s = 'abcbcd',那么您的程序应该打印:

Longest substring in alphabetical order is: abc

我进行了 运行 测试,它适用于我输入的大多数字符串,但是这个有问题。

在第15步,它应该比较2 > 0是真的,但它不执行, 有人可以解释一下吗?我哪里出错了?

我的代码如下所示:

s = 'zodworqozid'
curstring = [0]
longest = [0]
for i in range(1,len(s)):
    if s[i] >= str(curstring[-1]):
        curstring+= s[i]
        if len(curstring) > len(longest):
            longest = curstring
    else:
        curstring = s[i]

print('Longest substring in alphabetical order is:', longest)

I am using python tutor to help visualize the steps

错误 1:

curstring = [0]

您需要使用 s 中的第一个字符(而不是包含整数 0 的列表)来初始化您的 curstring。我看到您已经知道如何在您的代码中执行此操作。 (即 s[0])这是为了让您的后续代码能够正确地将下一个字符与 s 中的第一个字符进行比较。

错误 2:

longest = [0]

您需要将 longest 初始化为一个空的 列表 str(即 "")而不是 list 包含整数 0。这是因为您不需要 longest 中的列表功能,因为您直接返回 str.

错误 3:

longest = curstring

您需要复制 curstring,而不是将 longest 链接到 curstring。使用 list(curstring)curstring[:] 执行此操作。 这里没有错误。我将 curstring 误读为 list 而实际上它是 str.

这里:

curstring = [0]
longest = [0]

您正在创建两个列表,其中一个元素是一个整数 (0)。

稍后,这里:

if s[i] >= str(curstring[-1]):

您正在检查给定字母的值是否高于列表中的最后一个元素。由于 Python 是 zero-based,您从字母 'o' 开始(因为它有索引 1,恰好是您的范围列表中的第一个)。

for i in range(1,len(s)):

字符(字母)比较基于 ASCII table,因此给定的任何字母都会有一个 "higher value" 而不是 0('o' 是 111)。

因为第二个代码块的条件为真,字母 'o' 添加到此块的列表中:

curstring+= s[i]

之后,列表 curstring 有两个元素:0 和 'o'.

if len(curstring) > len(longest):

这里你比较的是 curstring(如上所述)和 longest,后者是一个包含一个元素的列表:0(如您在上述第一段代码中创建了一个包含一个元素的列表)。条件为真(2 个元素多于 1 个元素),所以 longest 现在 points 到与 curstring 相同的列表,因此有两个元素(并且长度 = 2)。

稍后,正如您在提供的可视化工具中看到的那样,curstring 引用变量未指向列表。执行此行时,它的类型发生了变化:

curstring = s[i]

所以后来,当添加一个字符时,当执行第 15 步时,结果是一个两个字母的字符串 "dw"。该字符串与包含两个元素(如上所述)的列表 longest 进行比较。字符串 "dw" 的长度为 2,列表的长度为 2,这就是条件为假的原因。

您应该阅读一下 Python 中的类型以及如何在代码中创建和维护变量 - 这将帮助您发现那些小错误。请记住,Python 在列表方面的语法与 C++ 或 Java 等语言不同 - 我假设您已经编写了该代码

curstring = [0]
longest = [0]

基于使用其他语言的 arrays/lists 的经验。 Python 中的空列表是这样创建的:

new_list = []

我不确定 "On step 15, it should compare 2>0 which is true, but it does not execute, can someone explain this? where am i making a mistake?" 到底是什么意思。但是看看你的代码,

curstring = [0]
if s[i] >= str(curstring[-1]):

这两个语句的意思是当i==1时,Condition s[i] >= str(curstring[-1]) 总是为真,这在when s[1]中是不对的

进行更正。将 curstring 的初始值设置为 s[0],"curstring = s[0]" 将起作用。还有一个建议。我认为 "if s[i]>= s[i-1]" 更具可读性。

希望这会有所帮助。