繁体   English   中英

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

[英]Python3: for-loop break and else (if statement)

背景资料:

嘿,我要执行以下操作:我有一本以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语句尝试了不同的缩进,但是无法解决我的问题。

我建议您按以下方式更改功能(不更改逻辑):

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个嵌套循环。
因为在否定情况下,如果第一次发生错误,则无需检查其他任何内容。

使用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():

其他答案很好地解释了如何摆脱多个循环。 但是您也可以使用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循环的顺序相同。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM