【问题标题】:Remove elements from a 2D-list based on a 1D-list基于一维列表从二维列表中删除元素
【发布时间】:2019-03-18 14:40:21
【问题描述】:

我有 2 个列表

列表 A(称为 a):像这样的 2D 列表:[[1,'aaa'],[2,'bbb'],[3,'ccc'],[4,'ddd']]

列表 B(称为 b):像这样的一维列表:['aaa','abc','cba','acb']

我想根据列表 B 的内容从列表 A 中删除元素。 在示例中,预期结果是:

新建列表C(叫c): [[2,'bbb'],[3,'ccc'],[4,'ddd']] //既然没有元素'bbb', 'ccc'或列表中的“ddd”B

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

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

有没有更好的方法来做这个删除?创建一个新列表并添加元素或从原始列表中删除元素更好吗?

感谢您的帮助!

【问题讨论】:

  • 列表B中也没有'ddd'
  • 您可以通过将列表 B 设为字典来加快速度
  • @RocketHazmat 你是对的!我已经改正错误了,谢谢

标签: python list


【解决方案1】:

没有快多少,但使用列表理解可能更干净

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'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]

【讨论】:

  • 非常感谢!我以前不知道集合是什么。我的程序现在快了 100 倍。最后一种方法不适合我的情况,但它肯定可以帮助其他人。
猜你喜欢
  • 2016-07-13
  • 2018-09-30
  • 2017-06-25
  • 2022-09-23
  • 2018-11-20
  • 2021-07-25
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多