Blu*_*oon 4 python list filter
我有两个列表看起来像:
list1 = ['a','a','b','b','b','c','d','e','e','g','g']
list2 = ['a','c','z','y']
Run Code Online (Sandbox Code Playgroud)
我想要做的是保持list1的所有元素也在list2中.结果应该是:
outcome= ['a','a','c']
Run Code Online (Sandbox Code Playgroud)
使用in运算符,您可以检查元素是否处于序列中.
>>> list2 = ['a','c','z','y']
>>> 'x' in list2
False
>>> 'y' in list2
True
Run Code Online (Sandbox Code Playgroud)
使用列表理解:
>>> list1 = ['a','a','b','b','b','c','d','e','e','g','g']
>>> list2 = ['a','c','z','y']
>>> [x for x in list1 if x in list2]
['a', 'a', 'c']
Run Code Online (Sandbox Code Playgroud)
但x in list效率不高.你最好转换list2成一个set对象.
>>> set2 = set(list2)
>>> [x for x in list1 if x in set2]
['a', 'a', 'c']
Run Code Online (Sandbox Code Playgroud)
从Python 3开始使用 itertools.filterfalse
>>> import itertools
>>> list1 = ['a','a','b','b','b','c','d','e','e','g','g']
>>> list2 = ['a','c','z','y']
>>> list(itertools.filterfalse(lambda x:x not in list2,list1))
['a', 'a', 'c']
Run Code Online (Sandbox Code Playgroud)
该list呼叫是必要的,因为filterfalse返回一个itertools对象.
您也可以使用该filter功能
>>> list(filter(lambda x: x in list2 , list1))
['a', 'a', 'c']
Run Code Online (Sandbox Code Playgroud)