从列表中移除所有词语(保留白名单中的词)

0 投票
5 回答
533 浏览
提问于 2025-04-17 07:49

想象一下,有一个包含随机单词的列表:

words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon']

我想要去掉除了以下这些单词之外的所有单词(就像一个白名单):

colors = ['red', 'green', 'blue', 'orange', 'white']

然后我想得到下面这个列表(顺序很重要):

filtered = ['blue', 'white', 'red']

我考虑过这样做(这个方法效果不错):

filtered = filter (lambda a: a == 'red' or a == 'green' or a == 'blue' or a == 'orange' or a == 'white', words)

但这样做真的是最好的方法吗?最有效率吗?

5 个回答

1

虽然列表推导式通常被认为更符合Python的风格,但我还是喜欢使用功能性编程的filter,前提是我们可以不使用lambda来写它:

>> filter(set(colors).__contains__, words)
['blue', 'white', 'red']
2
words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon']
filterset = frozenset(['red', 'green', 'blue', 'orange', 'white'])
filtered = [x for x in words if x in filterset]

这个解决方案的好处是,即使对于一个比较大的 filterset,它的速度也会相对较快,并且它不假设 words 列表里只有独一无二的条目。

你可以把 filterset 直接当作你的 filterlist,但这样会影响性能,尤其是当列表很大的时候。

4

如果你想保持顺序并高效地过滤掉不是颜色的词,可以先创建一个颜色的集合,这样在检查某个词是否是颜色时会更快。然后你只需要遍历所有的词,把不是颜色的词过滤掉就可以了。

words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon']
colors = set(['red', 'green', 'blue', 'orange', 'white'])
print [word for word in words if word in colors]

输出:

['blue', 'white', 'red']

撰写回答