如何解决此list.remove()错误?

时间:2019-04-15 11:00:05

标签: python python-3.x

我有两个输入(文本-字符串,L1-要排除的字符串列表)。

我已经将“文本”转换为列表,并使用以下代码提取了每个单词并将其放入列表中:

app = Flask(__name__, static_folder='', static_url_path='')

现在,我必须从“文本”列表中删除L1列表中存在的单词。 为此,我使用了以下代码:

Text=list(Text.split())

输入:

for x in Text:
        if(x in L1):
            Text.remove(x)
print(Text)

所需的输出:

  

['jack','jill','went','market','buy','bread','cheese','cheese',   'jack','favorite','food']

实际输出:

  

['jack','jill','went',' the ”,“市场”,“购买”,“面包”,   “奶酪”,“奶酪”,“杰克”,“最喜欢的”,“食物”]

请告诉我,为什么“ the ”仍然出现在“文本”中?

我做错了什么? 我应该怎么做才能获得理想的结果?

5 个答案:

答案 0 :(得分:4)

您可以像这样简单地使用列表理解来获得所需的输出

Text = "jack and jill went to the market to buy bread and cheese cheese is jack favorite food"

L1 = ["and","he","the","to","is"]

Text= Text.split()

removed = [x for x in Text if x not in L1]

print(removed)

# Output : ['jack', 'jill', 'went', 'market', 'buy', 'bread', 'cheese', 'cheese', 'jack', 'favorite', 'food']

您的代码未按预期工作的原因是您要遍历列表,同时又要对其进行更改,这是不应该做的事情。

正如注释中提到的@blubberdiblub,此代码的时间复杂度为O(n*m)。如果我们可以确保列表O(n+m)中没有重复,则可以将其改进为L1。为此,请使用set的{​​{1}}表示形式。

答案 1 :(得分:1)

之所以不起作用,是因为您正在遍历列表时对其进行了修改,如您所见,这是行不通的。一种选择是遍历列表的副本,但是我认为Sreeram TP's答案是最好的方法。

答案 2 :(得分:1)

在遍历该列表时,请勿弄乱该列表。在这里:

for x in Text:
        if(x in L1):
            Text.remove(x)
print(Text)

当您从列表中删除x时,您的for循环然后尝试在Text中查找下一个要循环的元素,但是一个元素刚刚从其下面拉出,因此结束了向上走得太远,而不会像您想要的那样循环播放。如另一篇文章所述,您可以使用列表推导功能,也可以保存要删除的位置以供以后删除:

toRemove = []
for x in Text:
        if(x in L1):
            toRemove.append(x)

for x in toRemove:
    Text.remove(x)
print(Text)

但是列表理解方式要好得多

答案 3 :(得分:1)

您的代码无法正常工作的原因是,您正在list上进行迭代,同时在{{1} }。

答案 4 :(得分:0)

Split_text = Text.split() 匹配= [如果x不在L1中,则x表示Split_text中的x] 打印(匹配)