簡體   English   中英

Python3:for循環中斷和else(if語句)

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

背景資料:

嘿,我要執行以下操作:我有一本以ID為鍵的字典,以各種東西為值的列表。 值的一項是字符串 我想檢查列表中是否包含此字符串 我想對字典中的所有鍵執行此操作。

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

到現在為止還挺好。

此外,我要檢查的列表取決於用戶的一個控制台輸入,該輸入指定應檢查的列表。 控制台輸入為“ number”

我的想法是使用嵌套的for循環遍歷我的字典和列表,並比較字符串(值的項目)是否等於任何列表項。 如果是這樣,我想跳出循環。 如果在列表中找不到字符串,則我想執行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語句獲取打印輸出。 所以,我想我在for循環中推理時會出錯嗎? 也許,我根本不了解for循環?! 我已經用else語句嘗試了不同的縮進,但是無法解決我的問題。

我建議您按以下方式更改功能(不更改邏輯):

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個嵌套循環。
因為在否定情況下,如果第一次發生錯誤,則無需檢查其他任何內容。

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

其他答案很好地解釋了如何擺脫多個循環。 但是您也可以使用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循環的順序相同。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM