Python3: for-loop break и else (if statement)

Вопрос:

Исходная информация:

эй, я хочу сделать следующее: у меня есть словарь с идентификаторами как ключи и списки с различными вещами как ценность. Одним из элементов значения является строка. Я хочу проверить, если список содержит эту строку. И я хочу сделать это для всех ключей в моем словаре.

  • Если список содержит строку, я хочу напечатать «String is valid»
  • Если список не содержит строку, я хочу напечатать «String is not valid»

Все идет нормально.

Кроме того, списки, которые я хочу проверить, зависят от одного входа в консоль пользователя, который указывает, какой список нужно проверить. Консольный вход — «число».

Моя идея состояла в том, чтобы перебирать мой словарь и мой список с вложенным циклом for и сравнивать, если строка (элемент значения) равна любому элементу списка. Если это так, я хочу выйти из цикла. Если String не найден в списке, я хочу выполнить else-statement, чтобы напечатать сообщение «String is not valid».

Фрагмент кода:

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-loop? Или, может быть, я вообще не разбирался в петлях? Я пробовал разные indentions с else-statement, но не смог решить мою проблему.

Лучший ответ:

Я предлагаю вам изменить свою функцию следующим образом (без изменения логики):

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)

Это поможет вам выйти из трех вложенных циклов, как было отмечено в комментариях.
Потому что в отрицательном случае на первом неправильном происшествии вам не нужно ничего проверять.

Ответ №1

Используйте return, чтобы разбить весь ваш цикл. Наличие инструкции else не требуется, если у вас нет инструкции if для начала.

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 вместо множественного, если это лучшая практика. В следующий раз будьте осторожны с отступом.

Также вы можете проверить.keys() и.values()

Вы можете заменить:

for key in myDict:
for value in myDict[key][0]:

с:

for value in myDict.values():

Ответ №2

Другие ответы дают хорошее объяснение того, как вырваться из нескольких циклов. Но вы также можете упростить свой код, используя встроенные функции 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 циклов.)

Оцените статью
TechArks.Ru
Добавить комментарий