这里有这段代码
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