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

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

背景信息:

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

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

到目前为止,一切都很好。

此外,我想要检查的列表依赖于用户的一个控制台输入,它指定了应该检查哪个列表。控制台输入为"数字"。

我的想法是用嵌套的for循环迭代我的字典和列表,并比较,如果字符串(值的项)等于任何列表项。如果是的话,我想打破这个循环。如果在列表中找不到该字符串,我希望执行else语句以打印"string is not valid"消息。

代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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循环中的推理有错误吗?或者,我根本不理解循环?!我用else语句尝试了不同的缩进,但无法解决我的问题。


其他答案对如何突破多个循环给出了很好的解释。但是,您也可以通过使用Python的内置函数和列表理解来简化代码,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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循环的顺序相同。)


使用"返回"中断所有循环。如果没有任何if语句作为开头,则不需要使用else语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()。

您可以替换:

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

用:

1
for value in myDict.values():


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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个嵌套循环。因为在第一次错误发生的负面情况下,您不需要检查任何其他内容。