鱼C论坛

 找回密码
 立即注册
查看: 3349|回复: 7

[已解决]使用for语句读取列表,若元素存在“【”,会发生丢失或异常

[复制链接]
发表于 2022-8-20 11:29:24 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 夜路9恶小 于 2022-8-20 15:25 编辑

问题来源于新版Python课后作业第20讲的题目:
屏幕截图 2022-08-20 112259.png
发现使用for语句读取列表时,若元素为“【”,会发生报错或者丢失
  1. x = input("请输入测试字符串:")
  2. s1 = list(x)
  3. s2 = []
  4. print(s2,s1)
  5. for i in s1:
  6.     if i == '[' or i == '{' or i == '(':
  7.         s2.append(i)
  8.         s1.remove(i)
  9. print(s2,s1)
  10. b = 0
  11. c = 1
  12. for a in s2:
  13.     if a == "(":
  14.         temp = ")"
  15.         if temp != s1[b]:
  16.             c = 0
  17.             break
  18.     if a == "{":
  19.         temp = "}"
  20.         if temp != s1[b]:
  21.             c = 0
  22.             break
  23.     if a == "[":
  24.         temp = "]"
  25.         if temp != s1[b]:
  26.             c = 0
  27.             break
  28.     print(s2,s1)
  29.     b += 1
  30. if c == 1:
  31.     print("合法")
  32. else:
  33.     print("非法")
  34.    
复制代码

代码出现异常的情况:
屏幕截图 2022-08-20 112746.png
有没有大佬能告诉我是什么原理还是我有细节出错了
最佳答案
2022-8-20 14:04:46
for i in s1:
你可以把i 先理解成是s1的索引,一开始的时候,i=0,即s1[0] ,值是'{'。然后进入你的if 判断,被加入到s2列表,然后在s1列表中删除了。这个删除以后,s1[0] 就会由'['顶上去啦。
那么for循环的下一步,就是i =1,也就是直接是s1[1]了,所以'['(此时在s1[0]位置)就会被跳过,被忽略了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-20 12:41:50 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-20 17:34 编辑

       这种题用字典解决非常简单
  1. def foo(s):
  2.     d = {'{' : '}' , '[' : ']' , '(' : ')'}
  3.     while len(s) > 1:
  4.         if s[0] in d . keys():
  5.             if s[1] == d[s[0]]:
  6.                 s = s[2 :] . strip()
  7.             elif s[-1] == d[s[0]]:
  8.                 s = s[1 : -1] . strip()
  9.             else:
  10.                 break
  11.         elif s[-2] in d . keys() and s[-1] == d[s[-2]]:
  12.             s = s[: -2]
  13.         else:
  14.             break
  15.     return False if s else True

  16. s = input("请输入测试字符串 : ") . strip()
  17. if s:
  18.     print('合法 ^o^') if foo(s) else print('非法 T_T')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 13:28:18 | 显示全部楼层
jackz007 发表于 2022-8-20 12:41
这种题用字典加递归解决非常简单

你试试  " ()[]{} " 合法吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 13:38:09 | 显示全部楼层
我也来个例子吧,简单暴力
  1. def isRight(s):
  2.     s = ''.join([i for i in s if i in '()[]{}'])
  3.     while any(['()' in s, '[]' in s, '{}' in s]):
  4.         s = s.replace('()','').replace('[]','').replace('{}','')
  5.     return False if s else True

  6. s = input('请输入测试字符串:')
  7. print('合法 ^o^') if isRight(s) else print('非法 T_T')
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +5 收起 理由
jackz007 + 10 + 10 + 5 这才是真正有水平的代码!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 14:04:46 | 显示全部楼层    本楼为最佳答案   
for i in s1:
你可以把i 先理解成是s1的索引,一开始的时候,i=0,即s1[0] ,值是'{'。然后进入你的if 判断,被加入到s2列表,然后在s1列表中删除了。这个删除以后,s1[0] 就会由'['顶上去啦。
那么for循环的下一步,就是i =1,也就是直接是s1[1]了,所以'['(此时在s1[0]位置)就会被跳过,被忽略了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-20 15:19:31 | 显示全部楼层
抬头吧奔跑吧Q 发表于 2022-8-20 14:04
for i in s1:
你可以把i 先理解成是s1的索引,一开始的时候,i=0,即s1[0] ,值是'{'。然后进入你的if 判 ...

大佬nb,给你递茶
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-20 15:20:53 | 显示全部楼层
jackz007 发表于 2022-8-20 12:41
这种题用字典解决非常简单

好的,只是没学到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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