Python3:for循环中断和else(if语句) 背景资料:
哎,, 我想做以下工作:我有一个以ID为键的字典和一个以各种事物为值的列表。值的其中一项是字符串。我想检查列表是否包含此字符串。我想对我字典里的所有键都这么做Python3:for循环中断和else(if语句) 背景资料:,python,python-3.x,for-loop,if-statement,Python,Python 3.x,For Loop,If Statement,哎,, 我想做以下工作:我有一个以ID为键的字典和一个以各种事物为值的列表。值的其中一项是字符串。我想检查列表是否包含此字符串。我想对我字典里的所有键都这么做 如果列表包含字符串,我想打印“字符串有效” 如果列表不包含字符串,我想打印“字符串无效” 到目前为止,一切顺利 此外,我要检查的列表取决于用户的一个控制台输入,该输入指定应检查哪个列表。控制台输入为“数字” 我的想法是,如果字符串(值的项)等于任何列表项,则使用嵌套的for循环迭代字典和列表并进行比较。如果是,我想打破这个循环。如果在
- 如果列表包含字符串,我想打印“字符串有效”
- 如果列表不包含字符串,我想打印“字符串无效”
我正在运行它,但是不管字符串是否在列表中,我总是得到else语句的打印输出。那么,我猜我在for循环中的推理有错误?或者,我根本不懂for循环?!我尝试了else语句的不同缩进,但无法解决我的问题。我建议您按以下方式更改函数(不更改逻辑): 这将帮助您退出注释中提到的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]:
与:
其他答案很好地解释了如何打破多个循环。但您也可以通过使用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
在第一次匹配时短路。它可能更具可读性。(请注意,对于循环,多级列表理解的顺序与常规的顺序相同。)记住,这里有三个嵌套循环;中断
只会中断最里面的一个。哦,天哪,@DanielRoseman,我本可以自己知道-。-”。所以,现在让我把我的“思考”变成文字:我在列表中找到字符串,然后中断内部循环。我回到了循环中,“因为我的Dict[key][0]中的值。”“并搜索下一个键等。我的打印将是最后一件事,它将写入validationHelper.true,对吗?”?为了在找到匹配项时完全终止所有循环,我会添加break语句,对吗?返回是否应该替换break,而不是else?因此,返回基本上意味着“结束所有循环”,并且是这样工作的?因为,如果我以这种方式调整代码并尝试打印(validationHelper.true),我会得到以下错误:print(validationHelper.true)AttributeError:“function”对象没有属性“true”@Arseniy如果字典中的第一个键出现负值,我想继续使用第二个键。所以我需要继续检查,只是我有一个新的字符串,然后检查相同的字符串list@Shushiro很抱歉误读了你的问题,请检查我的最新答案。return的意思是“停止执行这个函数”并返回一些东西。哦,你需要的是返回字符串,而不是。真的
@Arseniy啊,好吧,不知怎么的,更新的答案刚刚出现了。我的“else”应该是for循环else子句,而不是if/else的else:那么你就不需要else语句了。让我更新我的答案
for key in myDict:
for value in myDict[key][0]:
for value in myDict.values():
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)