哎, 我想要执行以下操作:我有一个字典,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语句尝试了不同的缩进,但无法解决我的问题。
答案 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
循环的顺序相同。)