为什么这个“in”的说法不成立?

2024-06-28 15:06:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我这里有密码

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语句中放入什么样的正确代码才能检测到"mac'n'cheese"中的"cheese"?你知道吗


Tags: 字符串inifmac数组lengthsplitham
3条回答

我喜欢使用一个单独的数组,并向其中添加允许的值,而不是删除不允许的值。请参阅“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))

您在对列表进行迭代时正在修改它。具体地说,因为您正在删除项,而不是调整索引,所以您跳过了一些内容;在本例中是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))

问题是这条线:

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

相关问题 更多 >