del似乎没有删除列表中的任何内容

时间:2017-08-07 10:03:56

标签: python stop-words

for x,y in words:
    for z in x:
        if z in stopwords:
            del x[x.index(z)]

这是我的代码。单词中的数据是一个元组列表,其中元组如下所示:

(list of words, metadata)

我的代码的目的是从单词列表中删除所有停用词。 唯一的问题是,之后不会删除停用词......

我究竟做错了什么? 我已经尝试用

做了
x.pop(x.index(z))

但这似乎没有什么区别。

2 个答案:

答案 0 :(得分:4)

你可以使用嵌套列表理解来创建一个没有停用词的新列表:

stopwords = set(stopwords)  # just so "in" checks are faster
result = [([word for word in x if word not in stopwords], y) for x, y in words]

例如:

>>> stopwords = ['stop']
>>> words = [(['hello', 'you', 'stop'], 'somemeta')]
>>> stopwords = set(stopwords)  # just so "in" checks are faster
>>> result = [([word for word in x if word not in stopwords], y) for x, y in words]
>>> result
[(['hello', 'you'], 'somemeta')]

请注意,您通常不应修改要迭代的列表。这可能导致很多难以追踪的错误。

答案 1 :(得分:0)

for x,y in words:
    for z in x:
        if z in stopwords:
            del x[x.index(z)]

最外层循环将x分配给您的一个单词列表。我们暂时忽略y。第二个循环遍历该单词列表; removing elements from a list you're iterating over causes peculiar behaviour。它可能会跳过特定的单词。这适用于所有del,pop,remove和slice替换。

确保stopwordsset并根据它过滤每个单词会更有效:x[:] = [w for w in x if w not in stopwords]而不是内循环。此处的切片替换纯粹是为了确保x保持相同的对象,在这种情况下确保words内的条目更改。 这不会遇到上述迭代问题,因为列表推导在赋值将其存储到切片之前构建其列表。