从基于1D列表的2D列表中删除元素

时间:2019-03-18 14:40:22

标签: python list

我有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.

是否有更好的方法来执行此删除?创建新列表并追加元素或从原始列表中删除元素更好吗?

谢谢您的帮助!

1 个答案:

答案 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]