鱼C论坛

 找回密码
 立即注册
查看: 94|回复: 3

python第20讲列表II的最后一题不懂

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
与for缩进相同的那个else:
                                    if len(stack)==0:
                                                    print(“非法”)
                                   else:
                                                    print(“合法”)
这个的作用是什么
还有像“{()}【】”这种怎么判断是合法的
按照答案的代码不是只能判断左右对称的使用方式合法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
关于 Python 中 for-else 的用法与括号合法性判断

你提到的这段代码:
if len(stack) == 0:
    print("非法")
else:
    print("合法")

其实是和 for...else 结构配合使用的。这个 else 不是 if 的 else,而是 for 的 else,它的作用是:当 for 循环没有被 break 中断时,才会执行 else 里的内容。

举个例子:
for char in s:
    if 不合法:
        print("非法")
        break
else:
    print("合法")

也就是说,如果在 for 循环中发现了不合法的情况,就会 break,此时 else 不会执行;如果整个 for 循环都没有问题,才会执行 else 中的 print("合法")

如何判断括号是否合法?

像你说的 “{()}【】” 这种,其实是可以通过 栈(stack) 来判断是否匹配的。基本思路如下:

  • 遇到左括号(如 ( { 【)就压入栈中;
  • 遇到右括号(如 ) } 】)时,检查栈顶是否是对应的左括号;
  • 如果匹配,就弹出栈顶;
  • 如果不匹配,说明不合法;
  • 最后如果栈为空,说明所有括号都匹配成功。


注意:这种方法不仅能判断左右对称的情况,也能判断嵌套的合法性,比如 “{[()]}” 也是合法的。

示例代码:
def is_valid(s):
    stack = []
    pairs = {')': '(', '}': '{', '】': '【'}

    for char in s:
        if char in '({【':
            stack.append(char)
        elif char in ')}】':
            if not stack or stack[-1] != pairs[char]:
                print("非法")
                break
            stack.pop()
    else:
        if len(stack) == 0:
            print("合法")
        else:
            print("非法")

你可以试试输入 “{()}【】”,会输出 “合法”。

如果还有不懂的地方,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 jackz007 于 2025-3-29 23:41 编辑

1、for ... else,当循环条件不再成立,也就是在循环结束的时候,会来到 else 处执行,这个时候,列表 stack 应该是空的,否则,肯定是左括号比右括号多,自然不符合要求。

2、对于键盘输入 '{()}[]' 我们来看看是如何判断的:
     假设 s = ''{()}[]'',下面开始循环检查:
     stack = []
     第1次循环:s[0] = '{'   ->  stack . append(s[0])   -> stack = ['{']
     第2次循环:s[1] = '('   ->  stack . append(s[1])   -> stack = ['{' , '(']
     第3次循环:s[2] = ')'   ->  d == stack[-1] == '('  -> stack . pop()   -> stack = ['{']
     第4次循环:s[3] = '}'   ->  d == stack[-1] == '{'  -> stack . pop()  ->  stack = []
     第5次循环:s[4] = '['   ->  stack . append(s[4])    -> stack=['[']
     第6次循环:s[5] = ']'   ->  d == stack[-1] == '['  -> stack . pop()  -> stack = []
     else :
         stack = []  -> len(stack) == 0 ->  打印:'合法'
         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 前天 15:28 | 显示全部楼层
jackz007 发表于 2025-3-29 23:40
1、for ... else,当循环条件不再成立,也就是在循环结束的时候,会来到 else 处执行,这个时候,列表 stac ...

1,嗯...第一次循环结束后代码是不是在第一个if的stack。append(c)结束呢,后面的代码还会执行吗?
2,当遇到第一个右括号“)”时,stack==["{","("],根据if c==‘)’:
                                                                                    d="("
  为什么你给的回复里第三次循环之后stack=["{"]        此时d==stack。pop(),那么
                                                                                            
if d!=stack。pop():   就不会执行吧,那么接下来应该执行哪里呢
             print(“非法”)
             break
                                                                                    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表