0

我正在尝试从列表中删除不必要的单词(an、a、the)

Test = ['a', 'an', 'the', 'love']
unWantedWords = ['a', 'an', 'the']
RD1 = [x for x in Test if x != unWantedWords]
print(RD1)
output ->['a', 'an', 'the', 'love']

这有什么问题?

4

4 回答 4

5

问题是您将值 x 与整个列表 unWantedWords 进行比较。

RD1 = [x for x in Test if x != unWantedWords]

将 != 替换为 not in 以检查 x 是否...不在!

RD1 = [x for x in Test if x not in unWantedWords]
于 2013-10-04T07:53:45.823 回答
4
RD1 = [x for x in Test if x not in unWantedWords]

unWantedWords 是一个数组,您正在将您的单词与一个数组进行比较,这就是它不起作用的原因。

于 2013-10-04T07:51:47.923 回答
2

如果你不介意:

  1. 删除重复项
  2. 保留原始顺序

你可以简单地使用'set'(这里是核心算法):

>>> Test = ['a', 'an', 'the', 'love']
>>> unWantedWords = ['a', 'an', 'the']
>>> print set(Test) - set(unWantedWords)
set(['love'])

>>> print list(set(Test) - set(unWantedWords))
['love']

这具有优化复杂性的优点。

当然,您可以包装此代码以保留重复项和顺序...

于 2013-10-04T08:02:59.320 回答
1

这是错误的。

RD1 = [x for x in Test if x != unWantedWords]

if x != unWantedWords的条件检查 x 是否等于列表 unWantedWords,而不是检查 x 在 unWantedWords 中是否存在。

条件始终为真,因为 x 是字符串而不是列表。因此,您的所有单词都会添加到列表中。

正确的成语是if x not in unWantedWords

你可以做,RD1 = [x for x in Test if x not in set(unWantedWords)]

于 2013-10-04T07:55:37.447 回答