Python 这是为什么;在;陈述不正确?

Python 这是为什么;在;陈述不正确?,python,arrays,if-statement,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”,如果它找到了它;将其

我这里有这个密码

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
Toppings: egg|lettuce|cheese spread|mac'n'cheese
egg|lettuce|mac'n'cheese
输出正确-它从数组中删除了包含
“cheese”
的元素。但是,在输入时:

Toppings: ham|lettuce|cheddar cheese|sliced cucumber|tomato
ham|lettuce|sliced cucumber|tomato
Toppings: egg|lettuce|cheese spread|mac'n'cheese
egg|lettuce|mac'n'cheese

它不会将其从阵列中删除。当我在操作符中查找
时,它说它与整个单词不匹配,所以我认为它可以工作。在
“mac'n'cheese”
语句中,如果
语句能够检测到
“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
i=0

当我时,问题是这一行:

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
i=0

当i时,您在迭代列表时修改列表。具体地说,因为您删除的是项目,而不是调整索引,所以您跳过了一些内容;在这种情况下,
mac'n'cheese

您还遇到了另一个问题,您碰巧没有遇到这些输入。由于每个样本输入只删除了一个元素,
范围(0,长度-1)
恰好没有给出
索引器
;但如果移除的元素不止一个,它就会被移除

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

toppings = input("Toppings: ").split('|')

toppings_without_cheese = (top for top in toppings if 'cheese' not in top)

print('|'.join(toppings_without_cheese))

您正在修改列表,同时对其进行迭代。具体地说,因为您删除的是项目,而不是调整索引,所以您跳过了一些内容;在这种情况下,
mac'n'cheese

您还遇到了另一个问题,您碰巧没有遇到这些输入。由于每个样本输入只删除了一个元素,
范围(0,长度-1)
恰好没有给出
索引器
;但如果移除的元素不止一个,它就会被移除

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

toppings = input("Toppings: ").split('|')

toppings_without_cheese = (top for top in toppings if 'cheese' not in top)

print('|'.join(toppings_without_cheese))

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

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

当我尝试此操作时,我得到一个错误:
indexer错误:列表索引超出范围
-这就是为什么我使用length-1,因为这样做有效。这不是他遇到的问题,这不是正确的解决方案,但这是一个问题;巧合的是,
length-1
起作用了。感谢您的编辑,它现在起作用了!当它让meI选择相反方向时,将接受答案,这非常漂亮:
对于范围内的i(长度,0,-1):如果str中的“cheese”(分割[i]):del split[i-1]
问题是列表在迭代时被修改。此解决方案不可靠。当我尝试此解决方案时,我得到一个错误:
索引器:列表索引超出范围
-这就是为什么我使用长度-1,因为它有效。这不是他遇到的问题,这不是正确的解决方案,但这是一个问题;巧合的是,
length-1
起作用了。感谢您的编辑,它现在起作用了!当它让meI选择相反方向时,将接受答案,这非常漂亮:
对于范围内的i(长度,0,-1):如果str中的“cheese”(分割[i]):del split[i-1]
问题是列表在迭代时被修改。此解决方案不可靠。为什么使用索引而不是元素?为什么不能在split中为i说
?为什么你不能在split中为i说
??