为什么这个“in”语句没有评估为True?

时间:2015-09-01 00:22:25

标签: python arrays if-statement

我这里有这段代码

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",如果找到它;将它从数组中取出,然后打印出解析后的数组。

输入时:

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语句的正确代码是什么,以便在"cheese"中检测到"mac'n'cheese"

3 个答案:

答案 0 :(得分:4)

您在迭代时修改列表。具体来说,因为你要删除项目,而不是调整索引,所以你要跳过东西;在这种情况下,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))

答案 1 :(得分:1)

我喜欢使用单独的数组和ADD允许的值而不是删除不允许的值。见" 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))

答案 2 :(得分:-1)

问题在于这一行:

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