【问题标题】:Unwanted run through else/if not loop不需要的运行 else/if not 循环
【发布时间】:2021-03-28 02:50:24
【问题描述】:

这是一个小而关键的错误,因为它会影响您必须提供特定“未找到消息”的代码......但问题也可能在于我正在使用 csv 文件这一事实。 在这段代码中,我指定只有在找不到记录时才必须打印“未找到”,但无论如何它都会继续打印。

代码

import csv
with open('data.csv','w') as f:
    ans='y'
    while ans=='y':
        s=csv.writer(f)
        g=int(input("Enter GR number:"))
        n=input("Enter name:")
        m=float(input("Enter total marks:"))
        s.writerow([g,n,m])
        print()
        ans=input('Enter more?')
        
with open('data.csv','r') as f:
    print("SEARCHING FOR GR NUMBER")
    print()
    gr=int(input('Enter GR number to search:'))
    s=list(csv.reader(f))
    for i in s:
        if str(gr) in i:
            print(i)
    if str(gr) not in i:
        print('Record not found')

输出

Enter GR number:234
Enter name:Mia
Enter total marks:80

Enter more?y
Enter GR number:456
Enter name:Mark
Enter total marks:80

Enter more?n
SEARCHING FOR GR NUMBER

Enter GR number to search:234
['234', 'Mia', '80.0']
Record not found

我什至尝试过其他方法来打印未找到...但无论如何都会发生同样的错误,哈哈。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 这是因为在您的 for 循环找到记录之后,它无论如何都会搜索到最后,当它完成时,会点击检查找到的记录。你认为i 的值是什么时候你的for 循环完成?
  • 'i' '是列表形式的记录....但是第二个 if 在 for 循环本身之外
  • 我明白 :) 我在解释为​​什么它不起作用。

标签: python loops csv file if-statement


【解决方案1】:

这个特殊情况需要 Python 看似奇怪的for ... else-construct。仅当 for-loop 由于 break-statement 而没有结束时,才会选择 else-branch。

试试这个:

for i in csv.reader(f):
    if str(gr) in i:
        print(i)
        break
else:
    print('Record not found')

【讨论】:

  • 哦,谢谢你,代码运行得很好,而且很有意义....但是当然现在不能打印 2 条或更多条记录,尽管它还可以 :)
【解决方案2】:

假设您可能还想打印多个具有相同GR 编号的记录,试试这个:

found = False
for i in s:
    if str(gr) in i:
        print(i)
        found = True
if not found:
    print('Record not found')

在您的代码中,您只需检查被迭代的 last 行 :)

【讨论】:

    【解决方案3】:

    在此场景中,元素 i 是容器 s 的迭代器。由于您使用的是 Python 列表,因此项目将按插入排序。所以i == 234 在第一次迭代中,i == 456 在第二次迭代中。接下来,您检查if "234" not in "456": 是否属实。

    【讨论】:

    • 但即使我在 for 循环中使用 else 语句,它仍然会给出相同的错误
    • 而不是 if str(gr) not in i 从退出循环检查迭代器的状态(可能不是您想要做的事情),您可以改为执行 if str(gr) not in s 仅打印错误当用户尚未输入匹配的 GR 编号时。
    • 请注意,我上面评论中的建议应该以最小的更改解决您的问题,但这不是最佳方法,因为它会迭代列表两次。更多的解决方案可能是使用布尔值(例如,found = True)来指示何时找到至少一条记录。然后您可以打印错误if not found
    • @Durtal 提供了一个很棒的solution。我不知道 Python 中有一个 for/else 构造。它消除了在完成相同行为的同时管理 found 布尔值的需要。
    【解决方案4】:

    实际上你写的最后一个块有点错误。

    if str(gr) not in i:
            print('Record not found')
    

    您编写的上述代码只是检查 str(gr) 是否不存在于 i 中,并且将为任何迭代编写,因为我认为它只会出现在特定位置。因此打印未找到

    这里有一个解决方案;

    def check():
        for i in s:
            if str(gr) in i:
                print(i)
                return
        print('Record not found')
    
    check()
    

    这里我只是检查相同的条件,但如果匹配,我只是退出函数,因此不打印最后一行(即未找到)。如果不满足 if 条件,则移动到最后一行。

    【讨论】:

    • 非常感谢......现在第一部分工作得很好......但是当我输入一个不在记录中的 grno 时......它会打印四次“找不到记录”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多