【问题标题】:Why does my IF Statement not execute为什么我的 IF 语句不执行
【发布时间】:2017-07-02 12:10:34
【问题描述】:

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

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

在平局的情况下,打印第一个子字符串。例如,如果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

【问题讨论】:

  • len([0]) = 1 - 如果你想初始化一个空列表,你应该使用longest = []

标签: python string if-statement edx


【解决方案1】:

这里:

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,因此任何给定的字母都将具有比 0 更高的值('o' 是 111)。

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

curstring+= s[i]

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

if len(curstring) > len(longest):

在这里,您正在比较 curstring(如上所述)和 longest,它是一个包含一个元素的列表:0(因为您创建了一个包含一个元素的列表上面描述的第一块代码)。条件为真(2 个元素不止一个元素),因此 longest 现在 pointscurstring 相同,因此有两个元素(并且长度 = 2).

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

curstring = s[i]

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

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

curstring = [0]
longest = [0]

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

new_list = []

【讨论】:

    【解决方案2】:

    我不确定您所说的“在第 15 步,它应该比较 2>0,这是真的,但它没有执行,有人可以解释一下吗?我在哪里犯错了?”。但是看看你的代码,

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      错误1:

      curstring = [0]
      

      您将希望使用s的第一个字符初始化curstring(而不是包含Integer 0)的列表。我看到你已经知道如何在你的代码中执行此操作。 (即987654325 @)这是为了使您的后续代码将正确地将下一个字符与s的下一个字符进行比较。

      错误2:

      longest = [0]
      

      你要初始化longest作为空列表 stress> str(即987654330 @)而不是包含整数0的@ 987654332。这是因为您在longest中不需要列表功能,因为您直接返回str

      错误3: stress>

      longest = curstring
      

      你想要制作curstring而不是链接longestcurstring。使用list(curstring)或@ 4987654340 @执行此操作。这里没有bug。我误读curstring作为list当它是str

      【讨论】:

      • 如果@ 987654344是一个字符串,为什么副本longest?它不是如果对象是可变的。 span>
      • @ martijnpieters你是对的,我误读了curstring 987654347 @而不是str。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多