【问题标题】:How do I validate whether input is inside list of nested lists?如何验证输入是否在嵌套列表列表中?
【发布时间】:2017-10-10 22:55:39
【问题描述】:

我对python很陌生,所以如果我的错误很明显,请原谅我。

我遇到的问题是第 15 行。我正在努力检查输入值是否不在列表“列表”中

当前输入的所有值(在列表“list”中和不在列表“list”中)都将返回响应“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])

【问题讨论】:

  • 顺便说一句,避免使用与built-in python 关键字相同的名称命名变量,例如list 是一个 python 关键字,使用变量名隐藏它可能会产生意外行为,请考虑使用不同的变量名,如 mylist 等。不确定它是否与您的问题有关,但可能会有所帮助。

标签: python-3.x list nested-lists


【解决方案1】:

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 列表,我们正在检查该值是否仅在列表的 最外层 级别,这仍然是列表。

考虑以下几点:

列表列表:

>>> mylist = [['a', 'b'], ['x', 'y']]
>>> 'x' in mylist
False

对比一个单级的扁平列表:

>>> mylist = ['a', 'b', 'x', 'y']
>>> 'x' in mylist
True

要修复它,我们可以将初始列表列表转换为一个“平面”列表(单级),或者我们需要搜索“列表”中的每个子列表。

保持代码与原始代码接近,仅更改第 15 行列表搜索:

# check if input is not in list
if lang not in [item for sublist in mylist for item in sublist]:    
  print(srry)

此外,如评论中所述 - 考虑为“列表”使用不同的变量名称,该变量名称不会覆盖 built-in 关键字 list 以防止意外行为。这里我使用mylist 作为“列表”名称。


您可能会考虑的另一件事是在接受用户输入时使用str.lower()

>>> mylist = ["english", "french", "mandarin"]
>>> lang = str(input("language? ").lower())
language? French
>>> lang in mylist
True

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

希望这会有所帮助!

【讨论】:

  • 谢谢!你的选择更有意义。只是一个想法突然出现在我的脑海中,但是否可以通过使用关联数组进一步浓缩它? myArray{"english": "Hello", "french": "Bonjour", "mandarin":"你好"}
  • 是的,这是一个很好的主意,确保你给它分配了一个=符号,所以你有myarray = {"english": "Hello", "french": "Bonjour", "mandarin":"Ni Hao"},然后输出就变成了一行代码print (myarray[lang] + " " + welcmsg)
猜你喜欢
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2021-04-25
  • 1970-01-01
  • 2019-01-10
  • 2012-09-22
相关资源
最近更新 更多