Python3: for循环中的break和else(if语句)

3

背景信息:

嘿, 我想要做以下事情:我有一个字典,以ID作为键,值为各种东西的列表。值的其中一项是字符串。我想检查列表是否包含此字符串。我想对字典中的所有键执行此操作。

  • 如果列表包含该字符串,则要打印“字符串有效”
  • 如果列表不包含该字符串,则要打印“字符串无效”

到目前为止还算顺利。

此外,我要检查的列表取决于用户的一个控制台输入,该输入指定应检查哪个列表。控制台输入为"number"

我的想法是使用嵌套的for循环遍历我的字典和列表,并比较字符串(值的项目)是否等于任何列表项。如果是,我要退出循环。如果在列表中未找到字符串,则要执行else语句以打印我的“字符串无效”消息。

代码片段:

def validationHelper(myDict, myList):
        for key in myDict:
            for value in myDict[key][0]:
                for item in myList:
                    if value==item:
                        validationHelper.true="String is valid"
                        break
                else:
                    validationHelper.true="Warning: String is NOT valid"
          
def validation(anyList,helperfunc):
    if anyList=="one":
        return helperfunc(finalDict,myList1)
    if anyList=="two":
         return helperfunc(finalDict,myList2)
    if anyList=="three":
         return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

问题:

我运行这段代码,但无论字符串是否在列表中,我总是得到else语句的输出。所以,我猜想我的for循环推理出现了错误?或者,我根本没有理解for循环?我已经尝试了不同的缩进方式来处理else语句,但无法解决我的问题。


3
请记住这里有三个嵌套的循环;break 只会跳出最内层的循环。 - Daniel Roseman
哦,天啊,@DanielRoseman,我本来就可以自己知道的-.-"。所以,现在让我将我的“思考”用语言表达出来:我在列表中找到字符串并打破内部循环。我回到了循环中,“for value in my Dict[key][0]”,并对下一个键进行搜索等操作。我的打印输出将是写入validationHelper.true的最后一件事情,对吗?为了完全终止所有循环以找到匹配项,我需要添加break语句,对吗? - Shushiro
3个回答

1
我建议您按照以下方式更改函数(不改变逻辑):
def validationHelper(myDict, myList):
    for key in myDict:
        for value in myDict[key][0]:
            for item in myList:
                if value==item:
                    return "String is valid" # Add here to exit
    return "Warning: String is NOT valid" # will be returned inf nothing will be found in your 3 loops

def validation(anyList,helperfunc):
    if anyList=="one":
        return helperfunc(finalDict,myList1)
    if anyList=="two":
         return helperfunc(finalDict,myList2)
    if anyList=="three":
         return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper)

正如评论中所提到的那样,这将帮助您退出嵌套的3个循环。
因为在第一次出现错误的情况下,您不需要检查其他任何内容。


3
应该将返回语句放在替换break的位置,而不是放在else语句中吗? - Luke Smith
所以,return的意思是“结束所有循环”,基本上就像这样工作?因为如果我按照这种方式调整我的代码并尝试打印(validationHelper.true),我会得到以下错误:print(validationHelper.true) AttributeError: 'function' object has no attribute 'true' - Shushiro
@Arseniy 如果我的字典中第一个键出现负面情况,我想继续使用第二个键。因此,我需要继续检查,只是我有一个新的字符串,然后检查相同的列表。 - Shushiro
@Shushiro,我明白了,很抱歉误读了你的问题,请查看我的更新答案。而return的意思是“停止执行这个函数”,并且返回一些东西。哦,还有你需要返回一个字符串而不是.true - Laser
@Arseniy 哦,好的,不知何故更新的答案现在才显示出来。 - Shushiro
显示剩余3条评论

1
使用return来中断所有循环。如果一开始没有任何if语句,那么else语句是不必要的。
def validationHelper(myDict, myList):
    for item in myList:
        if item in myDict.values():
            return ("String is valid")
    return ("String is NOT valid")

def validation(anyList,helperfunc):
    if anyList=="one":
        return helperfunc(finalDict,myList1)
    elif anyList=="two":
        return helperfunc(finalDict,myList2)
    elif anyList=="three":
        return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

使用elif而不是多个if语句是更好的实践。下次注意缩进。

另外,您可能想要检查.keys()和.values()

您可以替换:

for key in myDict:
    for value in myDict[key][0]:

使用:

for value in myDict.values():

然而,我的“else”本意是for循环的else子句,而不是if/else的else。http://book.pythontips.com/en/latest/for_-_else.html - Shushiro
那么你就不需要else语句了。让我更新我的答案。 - Noooo

1
其他答案已经很好地解释了如何跳出多个循环。但是你也可以通过使用Python的内置函数和列表推导式来简化代码,像这样:
def validationHelper(myDict, myList):
    if any(v in myList for val in myDict.values() for v in val[0]):
        validationHelper.true="String is valid"
    else:
        validationHelper.true="Warning: String is NOT valid"

def validation(anyList,helperfunc):
    if anyList=="one":
        return helperfunc(finalDict,myList1)
    if anyList=="two":
         return helperfunc(finalDict,myList2)
    if anyList=="three":
         return helperfunc(finalDict,myList3)

validation(number, validationHelper)

print(validationHelper.true)

这应该和你的代码一样高效,因为any在第一个匹配时就会短路。而且它可能更易读。(请注意,多级列表推导与常规for循环的顺序相同。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接