aibd 发表于 2024-8-28 10:40:08

为什么循环中的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")

FishC 发表于 2024-8-28 10:40:19

您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:

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 小助理,如未能正确解答您的问题,请继续追问。

aibd 发表于 2024-8-28 10:49:36

FishC 发表于 2024-8-28 10:40
您好!看了您的代码,我发现了一些错误和改进的地方。让我们按步骤来修正:

1. **字符串拆分成列表**: ...

字符串反转之后只是顺序颠倒,但是字符串本身是保持不变的。在这一道题中,要求括号匹配。例如:['[','[']反转之后的列表为['[','['],而不是[']',']']。所以如果直接比较str_f和str_b中相同位置元素是否相同,这种思路应该是不可行的吧

FishC 发表于 2024-8-28 10:49:46

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 小助理,如未能正确解答您的问题,请继续追问。

学习编程中的Ben 发表于 2024-8-28 10:52:48

。。。你的 i 是下标。。。当然会一直加下去了.

aibd 发表于 2024-8-28 11:00:13

学习编程中的Ben 发表于 2024-8-28 10:52
。。。你的 i 是下标。。。当然会一直加下去了.

感谢抽出时间回答!
但是我的下标i只有在匹配成功的情况下才会加下去,如果匹配不成功的话就执行break跳出了循环,此时的i值应该没有再增加吧。我还特意检查了以下缩进{:10_266:}

aibd 发表于 2024-8-28 11:03:01

FishC 发表于 2024-8-28 10:49
你说得对,抱歉给你带来困惑。你的问题是如何正确地判断括号匹配,而不仅仅是字符串反转。在括号匹配问 ...

谢谢回复!{:10_288:}
只是我还没有学到字典,后面学到这部分知识点的时候我再回来看一看

FishC 发表于 2024-8-28 11:03:07

aibd 发表于 2024-08-28 11:03
谢谢回复!{:10_288:}
只是我还没有学到字典,后面学 ...

明白您的情况。那我们可以用一些更基础的技术来实现括号匹配——依然使用栈的思路,去掉字典。以下是改进后的代码,不使用字典:

```python
# 020讲课后作业:判断字符串的括号写法是否合法

# 输入字符串
str_test = input("请输入测试字符串:")

# 用于匹配括号的栈
stack = []

# 用一个函数来判断是否是匹配的括号
def is_match(open_bracket, close_bracket

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

学习编程中的Ben 发表于 2024-8-28 11:12:38

好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("]   直接 == "(" 就行了,你又不是比较列表。。。

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")

aibd 发表于 2024-8-28 11:25:39

学习编程中的Ben 发表于 2024-8-28 11:12
好吧,我搞错你代码的意思了。。。
你的判断有问题!!!比如说你的判断 == ["("]   直接 == "(" 就行了 ...

谢谢{:10_288:}
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不过这个帖子想找到的问题点已经找到了。谢谢!!!

学习编程中的Ben 发表于 2024-8-28 12:48:04

aibd 发表于 2024-8-28 11:25
谢谢
确实是这个问题,比较的是元素,而不是列表。当然,改过来之后我的代码还有很多问题,不 ...

不用谢{:10_279:}
页: [1]
查看完整版本: 为什么循环中的break没有按照预定的那样跳出循环,导致变量i的值恒等于目标值