鱼C论坛

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

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

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

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

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

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

问题来源于新版Python课后作业第20讲的题目:
屏幕截图 2022-08-20 112259.png
发现使用for语句读取列表时,若元素为“【”,会发生报错或者丢失
x = input("请输入测试字符串:")
s1 = list(x)
s2 = []
print(s2,s1)
for i in s1:
    if i == '[' or i == '{' or i == '(':
        s2.append(i)
        s1.remove(i)
print(s2,s1)
b = 0
c = 1
for a in s2:
    if a == "(":
        temp = ")"
        if temp != s1[b]:
            c = 0
            break
    if a == "{":
        temp = "}"
        if temp != s1[b]:
            c = 0
            break
    if a == "[":
        temp = "]"
        if temp != s1[b]:
            c = 0
            break
    print(s2,s1)
    b += 1
if c == 1:
    print("合法")
else:
    print("非法")
    
代码出现异常的情况:
屏幕截图 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]位置)就会被跳过,被忽略了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

       这种题用字典解决非常简单
def foo(s):
    d = {'{' : '}' , '[' : ']' , '(' : ')'} 
    while len(s) > 1:
        if s[0] in d . keys():
            if s[1] == d[s[0]]:
                s = s[2 :] . strip()
            elif s[-1] == d[s[0]]:
                s = s[1 : -1] . strip()
            else:
                break
        elif s[-2] in d . keys() and s[-1] == d[s[-2]]:
            s = s[: -2]
        else:
            break
    return False if s else True

s = input("请输入测试字符串 : ") . strip()
if s:
    print('合法 ^o^') if foo(s) else print('非法 T_T') 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你试试  " ()[]{} " 合法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

s = input('请输入测试字符串:')
print('合法 ^o^') if isRight(s) else print('非法 T_T')

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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]位置)就会被跳过,被忽略了。
想知道小甲鱼最近在做啥?请访问 -> 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,给你递茶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,只是没学到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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