【问题标题】:Python3: for-loop break and else (if statement)Python3:for-loop break 和 else(if 语句)
【发布时间】:2018-04-16 04:59:33
【问题描述】:

背景资料:

嘿, 我想做以下事情:我有一个以 ID 为键的字典和以各种事物为值的列表。该值的一项是字符串。我想检查一个列表是否包含这个 string。我想对字典中的所有键都这样做。

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

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

此外,我要检查的列表取决于用户的一个控制台输入,它指定应该检查哪个列表。控制台输入是“数字”

我的想法是使用嵌套的 for 循环遍历我的字典和列表,并比较字符串(值的项)是否等于任何列表项。如果是,我想跳出循环。如果在列表中找不到字符串,我想执行 else 语句来打印我的“字符串无效”消息。

代码sn-p:

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 循环中的推理有误?或者,我根本不理解 for 循环?!我用 else 语句尝试了不同的缩进,但无法解决我的问题。

【问题讨论】:

  • 记住这里有三个嵌套循环; break 只会突破最里面的那个。
  • 哦,伙计,@DanielRoseman,我本可以自己知道的 -.-" 。所以,现在让我把我的“想法”用文字表达出来:我在列表中找到字符串,然后打破内部循环。我回到循环中,“for value in my Dict[key][0]”并执行搜索下一个键等。我的打印将是最后一件事,它被写入validationHelper.true,对吗?为了在找到匹配项时完全终止所有循环,我会添加 break 语句,对吗?

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


【解决方案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)

这将帮助您退出 cmets 中提到的 3 个嵌套循环。
因为在第一次错误发生的否定情况下,您不需要检查其他任何内容。

【讨论】:

  • 不应该return代替break,而不是在else情况下吗?
  • 所以,return 基本上意味着“结束所有循环”,并且像这样工作?因为,如果我以这种方式调整代码并尝试打印(validationHelper.true),我会收到以下错误: print(validationHelper.true) AttributeError: 'function' object has no attribute 'true'
  • @Arseniy 在我的字典中第一个键出现负数的情况下,我想继续使用第二个键。所以我需要继续检查,只是我有一个新字符串,然后检查同一个列表
  • @Shushiro 很抱歉误读了您的问题,请查看我的更新答案。 return 的意思是——“停止执行这个函数”并返回一些东西。哦,你需要返回字符串而不是.true
  • @Arseniy 好吧,不知何故,刚刚更新的答案出现了
【解决方案2】:

使用 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():

【讨论】:

【解决方案3】:

其他答案很好地解释了如何打破多个循环。但您也可以使用 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 循环的顺序相同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2015-10-24
    • 2023-04-02
    • 1970-01-01
    • 2016-04-08
    • 2022-01-24
    相关资源
    最近更新 更多