我有2个列表
列表A(称为a):2D列表,例如:[[1,'aaa'],[2,'bbb'],[3,'ccc'],[4,'ddd']] >
列表B(称为b):1D列表,例如:['aaa','abc','cba','acb']
我想根据列表B的内容从列表A中删除元素。 在示例中,预期结果是:
新列表C(称为c):[[2,'bbb'],[3,'ccc'],[4,'ddd']] //由于没有元素'bbb','ccc'或列表B中的“ ddd”
我当前正在使用以下代码,但发现它非常慢:
CMake Error at C:/Program Files/CMake/share/cmake-3.14/Modules/FindBoost.cmake:2132 (message):
Unable to find the requested Boost libraries.
Unable to find the Boost header files. Please set BOOST_ROOT to the root
directory containing Boost or BOOST_INCLUDEDIR to the directory containing
Boost's headers.
是否有更好的方法来执行此删除?创建新列表并追加元素或从原始列表中删除元素更好吗?
谢谢您的帮助!
答案 0 :(得分:4)
速度不是很快,但是使用列表理解也许更干净
c = [elem for elem in a if elem[1] not in b]
如果b
非常大,则转换为集合将大大加快速度,因为列表中的查找是线性时间O(n)
,而集合中的查找却是恒定时间O(1)
< / p>
b_set = set(b)
c = [elem for elem in a if elem[1] not in b_set]
如果a
('aaa', 'bbb',
等)的index-1元素是唯一的,则这可能甚至更快,因为我们可以使用set difference operator -
a_dict = {k: v for v, k in a}
b_set = set(b)
set_difference = a_dict.keys() - b_set
c = [(a_dict[k]: k) for k in set_difference]