如何验证输入是否在嵌套列表的列表中?
How do I validate whether input is inside list of nested lists?
我是 python 的新手,所以如果我的错误很明显,请原谅我。
我遇到的问题是第 15 行。我正在努力检查输入值是否不在列表中 "list"
当前输入的所有值(在和不在列表 "list" 中)将 return 响应 "srry"。
我知道第 15 行有问题,因为如果我创建一个单独的列表,其中没有国家/地区的嵌套列表:仅在第 15 行调用英格兰、法语和普通话,则会按预期打印基于输入的适当响应.
如有任何帮助,我们将不胜感激。
#input
lang = str(input("Please Type in the Language you speak and press enter
('make sure you use a capital letter')"))
#list of countries
list = [["English", "english"], ["French", "french"], ["Mandarin",
"mandarin"]]
#list of responses
lls = ["Hello,", "Bonjour,", "Ni Hao"]
srry = "Sorry, but I don't speak that"
welcmsg = "Welcome to Coventry"
# check if input is not in list
if str(lang) not in list:
print(srry)
#provide appropriate response based on input
elif str(lang) in list[0]:
print(lls[0] + " " + welcmsg)
elif str(lang) in list[1]:
print(lls[1] + " " +welcmsg)
elif str(lang) in list[2]:
print(lls[2])
TLDR;更改第 15 行以搜索列表列表:
# check if input is not in list
if lang not in [item for sublist in mylist for item in sublist]:
print(srry)
详情:
问题是 "list"
是一个嵌套的-list
(一个列表的列表),所以当我们检查输入值是否是 而不是 in
列表,我们正在检查该值是否仅在列表的 outer-most 级别,它们仍然是列表。
考虑以下几点:
列表列表:
>>> mylist = [['a', 'b'], ['x', 'y']]
>>> 'x' in mylist
False
对比单级平面列表:
>>> mylist = ['a', 'b', 'x', 'y']
>>> 'x' in mylist
True
要修复它,我们可以将初始列表列表转换为一个 "flat" 列表(单级),或者我们需要搜索 [=59= 中的每个子列表].
保持代码尽可能接近原始代码,仅更改第 15 行列表搜索:
# check if input is not in list
if lang not in [item for sublist in mylist for item in sublist]:
print(srry)
此外,如评论中所述 - 考虑为 "list" 使用不覆盖 built-in
关键字 list
的不同变量名称以防止意外行为。在这里,我使用 mylist
作为 "list" 名称。
您可能会考虑的另一件事是在获取用户输入时使用 str.lower():
>>> mylist = ["english", "french", "mandarin"]
>>> lang = str(input("language? ").lower())
language? French
>>> lang in mylist
True
用户仍然可以使用大写字母作为输入,但它使输入验证更容易检查,检查的字符串更少。只是一个小提示。
希望对您有所帮助!
我是 python 的新手,所以如果我的错误很明显,请原谅我。
我遇到的问题是第 15 行。我正在努力检查输入值是否不在列表中 "list"
当前输入的所有值(在和不在列表 "list" 中)将 return 响应 "srry"。
我知道第 15 行有问题,因为如果我创建一个单独的列表,其中没有国家/地区的嵌套列表:仅在第 15 行调用英格兰、法语和普通话,则会按预期打印基于输入的适当响应.
如有任何帮助,我们将不胜感激。
#input
lang = str(input("Please Type in the Language you speak and press enter
('make sure you use a capital letter')"))
#list of countries
list = [["English", "english"], ["French", "french"], ["Mandarin",
"mandarin"]]
#list of responses
lls = ["Hello,", "Bonjour,", "Ni Hao"]
srry = "Sorry, but I don't speak that"
welcmsg = "Welcome to Coventry"
# check if input is not in list
if str(lang) not in list:
print(srry)
#provide appropriate response based on input
elif str(lang) in list[0]:
print(lls[0] + " " + welcmsg)
elif str(lang) in list[1]:
print(lls[1] + " " +welcmsg)
elif str(lang) in list[2]:
print(lls[2])
TLDR;更改第 15 行以搜索列表列表:
# check if input is not in list
if lang not in [item for sublist in mylist for item in sublist]:
print(srry)
详情:
问题是 "list"
是一个嵌套的-list
(一个列表的列表),所以当我们检查输入值是否是 而不是 in
列表,我们正在检查该值是否仅在列表的 outer-most 级别,它们仍然是列表。
考虑以下几点:
列表列表:
>>> mylist = [['a', 'b'], ['x', 'y']]
>>> 'x' in mylist
False
对比单级平面列表:
>>> mylist = ['a', 'b', 'x', 'y']
>>> 'x' in mylist
True
要修复它,我们可以将初始列表列表转换为一个 "flat" 列表(单级),或者我们需要搜索 [=59= 中的每个子列表].
保持代码尽可能接近原始代码,仅更改第 15 行列表搜索:
# check if input is not in list
if lang not in [item for sublist in mylist for item in sublist]:
print(srry)
此外,如评论中所述 - 考虑为 "list" 使用不覆盖 built-in
关键字 list
的不同变量名称以防止意外行为。在这里,我使用 mylist
作为 "list" 名称。
您可能会考虑的另一件事是在获取用户输入时使用 str.lower():
>>> mylist = ["english", "french", "mandarin"]
>>> lang = str(input("language? ").lower())
language? French
>>> lang in mylist
True
用户仍然可以使用大写字母作为输入,但它使输入验证更容易检查,检查的字符串更少。只是一个小提示。
希望对您有所帮助!