【问题标题】:For loops, conditional statements, countingFor 循环、条件语句、计数
【发布时间】:2019-07-24 17:14:57
【问题描述】:

'没有这样的值。'对每个不满足条件的i 重复。最后一行始终是“没有这样的维度”。

我尝试过使用 continue 和 break 以及缩进。

print('Which dimension would you like to search on?')
dimension = input().lower()

#check for dimension. if it exists, search value. else, print 'No such dimension.'

for i in range(1,100,1):
    if str(sheet.cell(row=1, column=i).value.lower()) == dimension:
        searchcolumn = i
        print('Which ' + dimension.lower() + ' would you like to search for?')
        value = input().lower()

#check for value. if it exists, print row and count. else, print 'No such value.'

        for i in range(1,100,1):
            if str(sheet.cell(row=i, column=searchcolumn).value.lower()) == value \
            or str(sheet.cell(row=i, column=searchcolumn).value) == value:
                    print('Row ' + str(i))

            else: print('No such value.')
        else: print('No such dimension.')
        break

预期:输入无效维度会返回“没有这样的维度”。脚本结束。有效维度然后询问要查找的值。输入有效值仅返回“Row #”。无效值返回“没有这样的值”。脚本结束。

实际:有效尺寸没问题。无效维度返回“AttributeError nonetype ...”。有效值返回“No such value”和“Row #”,最后返回“No such dimension”。无效值返回(“没有这样的值”)*100 和“没有这样的维度”。

【问题讨论】:

    标签: python python-3.x loops for-loop


    【解决方案1】:

    首先,for 循环上的else 子句在循环用尽而未到达break 语句时执行。由于您的内部循环没有break 语句,因此在循环结束时,else 将始终被执行,因此不需要打印。这就是为什么您希望将else 取消缩进到外部for 的行。这意味着,在所有列上循环,如果任何与维度匹配,我们将永远不会打印 breakNo such dimension

    内循环也是如此。如果我们找到printbreak 的值。如果我们覆盖了所有行并且从未达到该值,则我们没有break,因此将执行else,并打印No such value。把它全部放在代码中会更清楚:)

    dimension = input('Which dimension would you like to search on?').lower()
    
    for i in range(1,100,1):
        if str(sheet.cell(row=1, column=i).value.lower()) == dimension:
            ...
            for i in range(1,100,1):
                if str(sheet.cell(row=i, column=searchcolumn).value).lower() == value:
                    print('Row ' + str(i))
                    break
    
            else: print('No such value.')
            break
    else: print('No such dimension.')
    

    如果您想打印列中的所有匹配值,我们将不得不绕过它,例如:

    for i in range(1,100,1):
        if str(sheet.cell(row=1, column=i).value.lower()) == dimension:
            ...
            found = False
            for i in range(1,100,1):
                if str(sheet.cell(row=i, column=searchcolumn).value).lower() == value:
                    print('Row ' + str(i))
                    found = True
    
            if not found: print('No such value.')
            break
    else: print('No such dimension.')
    

    最后,您还可以计算匹配的行数,然后将其用作检查器。即:

    ...
            found = 0
            for i in range(1,100,1):
                if str(sheet.cell(row=i, column=searchcolumn).value).lower() == value:
                    print('Row ' + str(i))
                    found += 1
    
            if not found: print('No such value.')
            else: print(f"Found {found} values")
            break
    ...
    

    【讨论】:

    • 感谢您为我指明正确的方向。但是,我想更进一步。如果我理解正确,则在第一次满足条件时触发中断。您将如何查看值所在的每一行?也就是说,只在范围的末尾打断并计算条件已满足多少次?
    • 我不确定我是否完全理解。我想我有点预见到你在说什么,因此添加了第二个代码,也许你错过了。如果您正在谈论做一个counter 匹配多少个值,那是另一回事,但完全不是问题。尝试澄清@programmerdan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2022-11-26
    • 2023-04-10
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多