为什么循环中的break没有按照预定的那样跳出循环,导致变量i的值恒等于目标值
这是020讲课后作业的动手环节,代码如下。在代码中,设置当出现指定元素不相等的情况就跳出循环,此时变量i并未执行i+=1,直到所有元素都正确匹配后i才会等于列表长度。但是运算的结果是:只要输入的字符串长度为偶数,不管实际是否合法,最终打印的将结果都是“合法”,这与代码的预先设置不符。
求助大佬指点以下代码中的错误出现在哪里。【万分感谢!!】
#020讲课后作业:判断字符串的括号写法是否合法#
str_test = input("请输入测试字符串:")#这里得到的只是一个字符串#
str_test0 = [] #将字符串单个拆分,装入给定的列表,初始列表为空#
for each in str_test:
str_test0.append(each) #将字符串中的每个元素按顺序装入列表#
str_test = str_test0 #列表重命名#
str_len = len(str_test) #得到列表的长度,表明里面的元素总数#
a = int(str_len/2) #列表长度的一半,需要取整数#
if str_len % 2 == 0: #只有当列表长度为偶数时才有可能合法,奇数可以直接判定不合法#
str_f = str_test[:a] #将列表的前半部分切片给新列表f#
str_b = str_test #将列表的后半部分切片给新列表b#
str_b = str_b[-1::-1] #将新列表b中的元素倒序排布并重新指定为列表b#
i = 0 #定义一个变量i用于遍历#
while i < len(str_f): #因为列表的下标索引从0开始,所以为<,而不是<=#
if str_f == ["("]: #判断列表f中指定元素的类型#
if str_b != [")"]: #判断列表b中对应指定元素的类型#
break #若不满足条件,直接退出循环,不必再判断后面的元素,此时i的值为上一次,未更新#
if str_f == ["["]:
if str_b != ["]"]:
break
if str_f == ["{"]:
if str_b != ["}"]:
break
i += 1
if i == len(str_f): #根据i最终的值判断是否所有元素都符合判断条件,即合法#
print("合法^o^") #注意:若要合法,则i应遍历f的所有元素,再完成最后一个元素的判断后,i还需要执行依次i+=1的语句#
else:
print("非法T_T")
else:
print("非法T_T") 您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:
1. **字符串拆分成列表**:这一部分可以简化。
2. **前半部分和后半部分**:需要通过切片操作,但您的代码有些混乱。
3. **比较过程**:比较过程中设置有误,需要确保使用正确的嵌套逻辑和break语句。
修改后的代码如下:
# 020讲课后作业:判断字符串的括号写法是否合法
# 输入字符串
str_test = input("请输入测试字符串:")
# 将字符串转换为列表
str_list = list(str_test)
# 得到列表的长度
str_len = len(str_list)
# 检查是否为偶数长度
if str_len % 2 == 0:
# 将字符串分为前后两部分
a = int(str_len / 2)
str_f = str_list[:a]
str_b = str_list
# 将后半部分反转
str_b.reverse()
# 检查前后半部分是否完全相等
for i in range(a):
if str_f != str_b:
print("不合法")
break
else:
# 如果没有在循环中跳出,则说明合法
print("合法")
else:
print("不合法")
具体的修正如下:
1. **字符串转列表**:使用`list()`函数可以直接把字符串拆分为单个字符的列表。
2. **分割与反转**:使用切片操作来分割列表,并用`reverse()`方法反转后半部分。
3. **比较过程**:如果前半部分与反转后的后半部分每个元素都相等,则字符串的括号写法是合法的。
希望这能帮助您理解原代码中的问题,进而修复代码。若有其他疑问,欢迎继续咨询!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-8-28 10:40
您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:
1. **字符串拆分成列表**: ...
字符串反转之后只是顺序颠倒,但是字符串本身是保持不变的。在这一道题中,要求括号匹配。例如:['[','[']反转之后的列表为['[','['],而不是[']',']']。所以如果直接比较str_f和str_b中相同位置元素是否相同,这种思路应该是不可行的吧 aibd 发表于 2024-08-28 10:49
字符串反转之后只是顺序颠倒,但是字符串本身是保持不 ...
你说得对,抱歉给你带来困惑。你的问题是如何正确地判断括号匹配,而不仅仅是字符串反转。在括号匹配问题中,需要关注括号的配对关系。
可以使用栈的数据结构来解决括号匹配问题。以下是改进后的代码:
# 020讲课后作业:判断字符串的括号写法是否合法
# 输入字符串
str_test = input("请输入测试字符串:")
# 用于匹配括号的栈
stack = []
# 括号配对字典
bracket_pairs = {'(': ')', '{': '}', '[': ']'}
# 遍历输入字符串中的每一个字符
for char in str_test:
if char in bracket_pairs:
# 如果字符是左括号,入栈
stack.append(char)
elif char in bracket_pairs.values():
# 如果字符是右括号,检查是否与栈顶左括号匹配
if stack and bracket_pairs] == char:
# 匹配成功,出栈
stack.pop()
else:
# 匹配失败
print("不合法")
break
else:
# 最后检查栈是否为空,如果为空则括号合法
if not stack:
print("合法")
else:
print("不合法")
这个代码的逻辑是:
1. **使用栈**:当遇到左括号,入栈;遇到右括号,检查栈顶是否匹配。
2. **匹配成功**:若匹配成功,出栈;若匹配失败,判定为不合法。
3. **遍历结束后**:检查栈是否为空,若为空则字符串合法,否则不合法。
这样可以正确判断括号的配对关系。希望这次的解释能帮到你,有其他问题欢迎继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 。。。你的 i 是下标。。。当然会一直加下去了. 学习编程中的Ben 发表于 2024-8-28 10:52
。。。你的 i 是下标。。。当然会一直加下去了.
感谢抽出时间回答!
但是我的下标i只有在匹配成功的情况下才会加下去,如果匹配不成功的话就执行break跳出了循环,此时的i值应该没有再增加吧。我还特意检查了以下缩进{:10_266:} FishC 发表于 2024-8-28 10:49
你说得对,抱歉给你带来困惑。你的问题是如何正确地判断括号匹配,而不仅仅是字符串反转。在括号匹配问 ...
谢谢回复!{:10_288:}
只是我还没有学到字典,后面学到这部分知识点的时候我再回来看一看 aibd 发表于 2024-08-28 11:03
谢谢回复!{:10_288:}
只是我还没有学到字典,后面学 ...
明白您的情况。那我们可以用一些更基础的技术来实现括号匹配——依然使用栈的思路,去掉字典。以下是改进后的代码,不使用字典:
```python
# 020讲课后作业:判断字符串的括号写法是否合法
# 输入字符串
str_test = input("请输入测试字符串:")
# 用于匹配括号的栈
stack = []
# 用一个函数来判断是否是匹配的括号
def is_match(open_bracket, close_bracket
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("] 直接 == "(" 就行了,你又不是比较列表。。。
str_test = input("请输入测试字符串:")#这里得到的只是一个字符串#
str_test0 = [] #将字符串单个拆分,装入给定的列表,初始列表为空#
for each in str_test:
str_test0.append(each) #将字符串中的每个元素按顺序装入列表#
str_test = str_test0 #列表重命名#
str_len = len(str_test) #得到列表的长度,表明里面的元素总数#
a = int(str_len/2) #列表长度的一半,需要取整数#
if str_len % 2 == 0: #只有当列表长度为偶数时才有可能合法,奇数可以直接判定不合法#
str_f = str_test[:a] #将列表的前半部分切片给新列表f#
str_b = str_test #将列表的后半部分切片给新列表b#
str_b = str_b[-1::-1] #将新列表b中的元素倒序排布并重新指定为列表b#
i = 0
while i < len(str_f):
print(str_f, "-", str_b);
if str_f == "(":
if str_b != ")":
break
if str_f == "[":
if str_b != "]":
break
if str_f == "{":
if str_b != "}":
break
i += 1
if i == len(str_f):
print("合法^o^")
else:
print("非法T_T")
else:
print("非法T_T") 学习编程中的Ben 发表于 2024-8-28 11:12
好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("] 直接 == "(" 就行了 ...
谢谢{:10_288:}
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不过这个帖子想找到的问题点已经找到了。谢谢!!! aibd 发表于 2024-8-28 11:25
谢谢
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不 ...
不用谢{:10_279:}
页:
[1]