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) |
这应该和您的代码一样有效,因为
使用"返回"中断所有循环。如果没有任何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个嵌套循环。因为在第一次错误发生的负面情况下,您不需要检查任何其他内容。