为什么我的IF语句没有执行

时间:2017-02-14 09:21:33

标签: python string if-statement edx

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

  

按字母顺序排列的最长子字符串是:beggh

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

  

按字母顺序排列的最长子字符串是: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

3 个答案:

答案 0 :(得分:0)

错误1:

curstring = [0]

您希望使用curstring中的第一个字符初始化s(而不是包含整数0的列表)。我知道您已经知道如何在代码中执行此操作。 (即s[0])这样您的后续代码就会正确地将下一个字符与s中的第一个字符进行比较。

错误2:

longest = [0]

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

错误3:

longest = curstring

您希望复制curstring而不是将longestcurstring相关联。使用list(curstring)curstring[:]执行此操作。此处没有错误。当curstring成为list时,我误以为str

答案 1 :(得分:0)

下面:

curstring = [0]
longest = [0]

你正在创建两个列表,里面有一个元素,它是一个整数(0)。

稍后,在这里:

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

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

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

Char(字母)比较基于ASCII table,因此给出的任何字母都会有更高的值"比0(' o'是111)。

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

curstring+= s[i]

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

if len(curstring) > len(longest):

在这里,你要比较 curstring (如上所述)和 longest 这是一个包含一个元素的列表:0(因为你创建了一个列表上面描述的第一个代码块中的元素。条件为真(2个元素不止一个元素),所以最长现在points curstring 在同一个列表中,因此有两个元素(和长度= 2)。

稍后,正如您在所提供的可视化工具中看到的那样, curstring 引用变量并不指向列表。执行此行时,它的类型会被更改:

curstring = s[i]

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

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

curstring = [0]
longest = [0]

基于其他语言的数组/列表的实验。 Python中的空列表是这样创建的:

new_list = []

答案 2 :(得分:0)

我不确定你到底是什么意思"在第15步,它应该比较2> 0这是真的,但它没有执行,有人能解释一下吗?我在哪里弄错了?"。但是看看你的代码,

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

这两个语句意味着当i == 1时,条件s [i]> = str(curstring [-1])总是为真,这在s [1]时是不正确的

要纠正它。将curstring的初始值设置为s [0]," curstring = s [0]"将工作。还有一个建议。我想"如果s [i]> = s [i-1]"更具可读性。

希望这会有所帮助。