基于一个一维列表,从二维列表中移除元素。

3

我有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']] //因为列表 B 中没有元素 'bbb'、'ccc' 或 'ddd'

我目前正在使用以下代码,但我发现它非常慢:

c = []
for elem in a:
    if elem[1] not in b:
        c.append(elem)

有没有更好的方法来完成这个移除操作?是创建一个新列表并添加元素更好,还是从原始列表中删除元素更好?

感谢您的帮助!


3
列表B中也没有“ddd”。 - gen_Eric
1
你可以通过将列表B转换为字典来加快速度。 - Mitch
@RocketHazmat 你说得对!我已经修复了错误,谢谢。 - Martin
1个回答

4

使用列表推导式可能更加简洁,虽然速度不会更快

c = [elem for elem in a if elem[1] not in b]

如果b非常大,那么将其转换为集合将显着加速操作速度,因为列表中的查找是线性时间O(n),而集合中的查找是常数时间O(1)
b_set = set(b)
c = [elem for elem in a if elem[1] not in b_set]

如果a的索引-1元素(例如'aaa','bbb'等)是唯一的,那么这可能会更快,因为我们可以使用集合差异运算符-

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]

1
非常感谢!我以前不知道什么是集合。现在我的程序快了100倍。最后一种方法不适合我的情况,但肯定可以帮助其他人。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接