夜路9恶小 发表于 2022-8-20 11:29:24

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

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

问题来源于新版Python课后作业第20讲的题目:

发现使用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:
            c = 0
            break
    if a == "{":
      temp = "}"
      if temp != s1:
            c = 0
            break
    if a == "[":
      temp = "]"
      if temp != s1:
            c = 0
            break
    print(s2,s1)
    b += 1
if c == 1:
    print("合法")
else:
    print("非法")
   
代码出现异常的情况:

有没有大佬能告诉我是什么原理还是我有细节出错了

jackz007 发表于 2022-8-20 12:41:50

本帖最后由 jackz007 于 2022-8-20 17:34 编辑

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

qq1151985918 发表于 2022-8-20 13:28:18

jackz007 发表于 2022-8-20 12:41
这种题用字典加递归解决非常简单

你试试" ()[]{} " 合法吗?

qq1151985918 发表于 2022-8-20 13:38:09

我也来个例子吧,简单暴力
def isRight(s):
    s = ''.join({}'])
    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')

抬头吧奔跑吧Q 发表于 2022-8-20 14:04:46

for i in s1:
你可以把i 先理解成是s1的索引,一开始的时候,i=0,即s1 ,值是'{'。然后进入你的if 判断,被加入到s2列表,然后在s1列表中删除了。这个删除以后,s1 就会由'['顶上去啦。
那么for循环的下一步,就是i =1,也就是直接是s1了,所以'['(此时在s1位置)就会被跳过,被忽略了。{:10_298:}

夜路9恶小 发表于 2022-8-20 15:19:31

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

大佬nb,给你递茶{:10_298:}

夜路9恶小 发表于 2022-8-20 15:20:53

jackz007 发表于 2022-8-20 12:41
这种题用字典解决非常简单

好的,只是没学到
页: [1]
查看完整版本: 使用for语句读取列表,若元素存在“【”,会发生丢失或异常