如何验证输入是否在嵌套列表的列表中?

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

用户仍然可以使用大写字母作为输入,但它使输入验证更容易检查,检查的字符串更少。只是一个小提示。

希望对您有所帮助!