【问题标题】:How to print a fail statement only after reaching end of loop in Python?如何仅在 Python 中到达循环结束后才打印失败语句?
【发布时间】:2020-10-08 01:37:56
【问题描述】:

我有一个小代码 sn-p,需要帮助来实现一个失败语句 (No match)。这是sn-p:

for row in reader:
    # converts each string num --> int num
    i = 1
    while i < len(row):
        row[i] = int(row[i])
        i += 1

    if STR_count_large(sequence) == row[1:]:
        print(row[0])

    if STR_count_small(sequence) == row[1:]:
        print(row[0])

我在名为readercsv 文件中遍历每个row,并将该行中的每个元素从字符串转换为整数。之后,我将该特定行的列表内容(从第一个元素到末尾)与两个函数进行比较,每个函数都包含一个列表。如果两个列表匹配,我打印row[0],它只包含匹配列表所属的人的姓名。但是,如果这两个if 语句在通过for row in reader: 循环后都失败了,我将如何只打印一次像No match 这样的语句?因为如果我将它写在循环中,这条语句将被打印row 次数而不是一次。

编辑: 这是我使用 bschlueter 的想法的(不成功的)实现。任何帮助将不胜感激:

exceptions = list()
            for row in reader:
                # converts each string num --> int num
                i = 1
                while i < len(row):
                    row[i] = int(row[i])
                    i += 1
                try:
                    if STR_count_large(sequence) == row[1:]:
                        print(row[0])
                    if STR_count_small(sequence) == row[1:]:
                        print(row[0])
                except (STR_count_large(sequence) != row[1:] and STR_count_small(sequence) != row[1:]) as exception:
                    exceptions.append(exception)
            if exceptions:
                print("No match")

【问题讨论】:

    标签: python list csv cs50


    【解决方案1】:

    你可以累积错误,然后在循环完成后检查累积:

    exceptions = list()
    for row in reader:
        try:
            do_a_thing(row)
        except MyException as exception:
            exceptions.append(exception)
    # Do something if any exceptions were added to the list
    if exceptions:
        handle_exceptions(exceptions)
    

    【讨论】:

    • 实现这个的正确方法是什么?我尝试使用这种结构,但我对 python 中的tryexcept 不太熟悉。我在原始帖子中添加了一个编辑,显示了我根据您的建议尝试实现此功能的版本。
    • 函数do_a_thing需要抛出MyException。 python 中的异常处理相当简单,只需搜索文档即可。看起来你最好只使用 if 语句,使用布尔值而不是累加器列表。
    【解决方案2】:

    只需再添加一个带有 and 的 if 语句来捕获和打印不匹配的内容。 在第二个 IF 语句的末尾添加这个

    if row == reader[len(reader)]:#Check for last iteration
        if STR_count_large(sequence) != row[1:]: and STR_count_small(sequence) != row[1:]:
            print("No Match")
    

    【讨论】:

    • 这个问题是它会打印No match 语句row 的次数(在这种情况下是3 次)。我只想打印一次No match 语句。
    • 我已编辑代码以根据阅读器长度检查最后一次迭代
    • 抱歉,这也不起作用,因为您不能在 reader 上调用 len(),因为它是一个 csv。感谢您尝试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2021-08-07
    • 2019-10-12
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多