Python3:for-loop break和else(if语句)

时间:2017-11-03 12:45:38

标签: python python-3.x for-loop if-statement

背景资料:

哎, 我想要执行以下操作:我有一个字典,ID为键,列表中包含各种值。其中一项是字符串。如果列表包含此字符串,我想检查一下。我想为我的词典中的所有键做这件事。

  • 如果列表包含字符串,我想打印"字符串有效"
  • 如果列表中不包含字符串,我想打印"字符串无效"

到目前为止,非常好。

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

我的想法是迭代我的字典和我的列表与嵌套的for循环并比较,如果字符串(值的项)等于任何列表项。如果是的话,我想摆脱循环。如果在列表中找不到String,我想执行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-statement的打印输出。所以,我想我的for循环中的推理有错误?或许,我根本不理解for循环?!我用else语句尝试了不同的缩进,但无法解决我的问题。

3 个答案:

答案 0 :(得分: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个嵌套循环,如评论中所述 因为在第一次错误发生的否定情况下,您不需要检查任何其他内容。

答案 1 :(得分: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():

答案 2 :(得分: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循环的顺序相同。)