Исходная информация:
эй, я хочу сделать следующее: у меня есть словарь с идентификаторами как ключи и списки с различными вещами как ценность. Одним из элементов значения является строка. Я хочу проверить, если список содержит эту строку. И я хочу сделать это для всех ключей в моем словаре.
- Если список содержит строку, я хочу напечатать “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)
Это поможет вам выйти из трех вложенных циклов, как было отмечено в комментариях.
Потому что в отрицательном случае на первом неправильном происшествии вам не нужно ничего проверять.
Используйте 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():
Другие ответы дают хорошее объяснение того, как вырваться из нескольких циклов. Но вы также можете упростить свой код, используя встроенные функции 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
циклов.)