从列表中移除所有词语(保留白名单中的词)
想象一下,有一个包含随机单词的列表:
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']