我有两个输入(文本-字符串,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 ”仍然出现在“文本”中?
我做错了什么? 我应该怎么做才能获得理想的结果?
答案 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] 打印(匹配)