为什么这个"in"语句的评估结果不是 True?



这里有这段代码

input1 = input("Toppings: ")
split = input1.split("|")
length = len(split)
for i in range(0, length-1):
  if "cheese" in str(split[i]):
    del split[i]
s = "|"
print(s.join(split))

,它的意思是取一个字符串,通过"|"分割成一个数组,然后在数组中搜索字符串"cheese",如果它找到它;将其从数组中取出,然后打印出解析后的数组。

当输入this:

Toppings: ham|lettuce|cheddar cheese|sliced cucumber|tomato
ham|lettuce|sliced cucumber|tomato

输出是正确的-它从数组中删除了包含"cheese"的元素。但是,当输入这个时:

Toppings: egg|lettuce|cheese spread|mac'n'cheese
egg|lettuce|mac'n'cheese

它不会从数组中删除它。当我查找in操作符时,它说匹配整个单词,所以我认为它会工作。在if语句中放入什么正确的代码才能使"mac'n'cheese"中检测到"cheese" ?

您正在修改列表,同时遍历它。具体来说,因为你删除了项目,但没有调整索引,你跳过了一些东西;本例中为mac'n'cheese .

你也有另一个问题,你碰巧没有遇到这些输入。由于每个样本输入只删除了一个元素,range(0, length-1)碰巧没有给出IndexError;但是如果要删除的元素不止一个,它就会。

这里有一个更好的方法来做你想做的事情:

toppings = input("Toppings: ").split('|')
toppings_without_cheese = (top for top in toppings if 'cheese' not in top)
print('|'.join(toppings_without_cheese))

我喜欢使用单独的数组并添加允许的值,而不是删除不允许的值。请参阅"allowedToppings"以及我如何切换下面的If语句。

input1 = input("Toppings: ")
split = input1.split("|")
length = len(split)
allowedToppings = []
for i in range(0, length-1):
    if not "cheese" in str(split[i]):
        allowedToppings.append(str(split[i]))
s = "|"
print(s.join(split))

问题出在这一行:

for i in range(0, length-1):

范围的末尾已经是排他的。你可以这样做:

for i in range(0, length):

但是这将抛出异常,因为指针将经过数组的末尾。修复它的简单方法是:

i = 0
while i<len(split):
  if "cheese" in str(split[i]):
    del split[i]
  else:
    i += 1

最新更新