Python 为什么我的IF语句不执行

Python 为什么我的IF语句不执行,python,string,if-statement,edx,Python,String,If Statement,Edx,我要做的是编写一个程序,打印字母按字母顺序排列的s中最长的子字符串。 例如,如果s='azcbobobegbegghakl',则您的程序应打印: 按字母顺序排列的最长子字符串是:beggh 如果是领带,请打印第一个子字符串。例如,如果s='abcbcd',则您的程序应打印: 按字母顺序排列的最长子字符串为:abc 我已经运行了测试,它可以在我输入的大多数字符串上运行,但这一个是有问题的 在步骤15,它应该比较2>0,这是真的,但它不执行, 有人能解释一下吗?我哪里出错了 我的代码如下所示: s

我要做的是编写一个程序,打印字母按字母顺序排列的
s
中最长的子字符串。 例如,如果
s='azcbobobegbegghakl'
,则您的程序应打印:

按字母顺序排列的最长子字符串是: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)
new_list = []
错误1:

curstring = [0]
您需要使用
s
中的第一个字符初始化
curstring
(而不是包含整数
0
的列表)。我发现您已经知道如何在代码中实现这一点。(即
s[0]
)这样,后续代码将正确比较
s
中的下一个字符和第一个字符

错误2:

longest = [0]
您需要将
最长的
初始化为空列表
str
(即
),而不是包含整数
0
列表。这是因为在直接返回
str
时,不需要在
longest
中使用列表功能

错误3:

您需要复制
curstring
,而不是将
longest
链接到
curstring
。使用
list(curstring)
curstring[:]
执行此操作。这里没有虫子。我把
curstring
误读为
列表
,当它是
str

时,这里:

curstring = [0]
longest = [0]
您正在创建两个列表,其中一个元素是整数(0)

稍后,这里:

if s[i] >= str(curstring[-1]):
您正在检查给定字母的值是否高于列表中的最后一个元素。正如Python一样,您从字母“o”开始(因为它有索引1,它恰好是范围列表中的第一个)

字符(字母)比较基于,因此任何给定的字母的“值”都将大于0('o'为111)

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

curstring+= s[i]
之后,列表curstring有两个元素:0和“o”

if len(curstring) > len(longest):
这里比较的是curstring(如上所述)和longest,后者是一个包含一个元素的列表:0(正如您在上面所述的第一个代码块中创建了包含一个元素的列表)。条件为true(2个元素是多个元素),因此现在最长的元素与curstring位于同一个列表中,因此有两个元素(长度=2)

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

curstring = s[i]
所以后来,当一个字符被添加时,当15。执行步骤后,结果是一个两个字母的字符串“dw”。该字符串与包含两个元素的最长列表进行比较(如上所述)。字符串“dw”的长度为2,列表的长度为2,这就是条件为false的原因

您应该阅读一些关于Python中的类型以及如何在代码中创建和维护变量的内容——这将帮助您发现这些小错误。请记住,Python在列表中的语法与C++、java等语言不同,我假设你已经编写了代码

curstring = [0]
longest = [0]
基于使用其他语言的数组/列表的经验。Python中的空列表是这样创建的:

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)
new_list = []

我不知道你所说的“在第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]”更具可读性


希望这会有所帮助。

len([0])=1
-如果要初始化空列表,应使用
longest=[]
如果
curstring
是字符串,为什么要复制
longest
?对象不是可变的。@MartijnPieters你说得对,我把
curstring
误读为
列表,而不是
str
。非常感谢。