【问题标题】:python delete list from another listpython从另一个列表中删除列表
【发布时间】:2017-03-13 05:32:18
【问题描述】:

有两个类似

的列表
[[A, A], [B, B], [C, C], [D, D]]

[[A, A], [B, B]]

如何从 1 中删除结果为 [[C, C], [D, D]] 的列表 2 并使其没有循环,因为两个列表都非常大并且循环运行缓慢?

谢谢 列举例子

>>>a = [[9, 9], [8, 8], [7, 7], [6, 6], [4, 4], [5, 5], [12, 12], [15, 15], [2, 2], [3, 3]] 

>>>b = [[4, 4], [5, 5]]

表单要求写我已经尝试过的,好的,它在下面 尝试一:(不行,而且里面有循环)

def rightdotsremowe (ax, bx): 
    for o in set(bx):
        try:
            ax.remove(o) 
        except ValueError:
            pass
    return ax

尝试两次(看起来更好但也不起作用)

newlist00 = [x for x in a if (x not in e)]

【问题讨论】:

  • 如果它们是一组元组,你可以减去它们,但我不知道如何在没有循环的情况下使用 2D 列表(意思是,小于 O(n))。跨度>

标签: python list set frozenset


【解决方案1】:

如果订单对您来说不是很重要,sets 会明显更快。所以你可以试试这个,它会比list更快。

a=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']]

a={tuple(i) for i in a}

并尝试使用difference方法:

返回新集合,其中元素在 a 中但不在 b 中

平均情况 O(len(a))

a=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']]
b=[['A', 'A'], ['B', 'B']]

a={tuple(i) for i in a}
b={tuple(i) for i in b}

print a.difference(b)

那是因为set 使用哈希函数映射到存储桶。由于 Python 实现会自动调整该哈希表的大小,因此速度可以保持不变O(1)

Sets 在确定对象是否在集合中时明显更快,但在迭代其内容时比lists 慢。

希望这会有所帮助。

【讨论】:

  • 制作一套并不能神奇地让事情变得更快。设置 lookups 为 O(1)。这也根本没有解决过滤方面的问题。
【解决方案2】:
[obj for obj in a if obj not in b]

【讨论】:

  • 在 [x for x in a if (x not in e)] 中使用 'b' 而不是 'e'。它应该可以工作
  • 我不知道e 是从哪里来的。 OP从来没有说过什么“不起作用”,所以我们只能猜测。如果这是一个简单的错字,则不需要回答,因为这种问题没有用。如果是其他内容,则此答案不会添加问题中不存在的任何内容。
  • 你说得对,是我的错。 "e" 来自于试图理解中风出了什么问题,意思是 e= [5, 5] 我试图让列表 2 更简单,但里面没有列表
【解决方案3】:

只需将要删除的项目转换为一组元组,然后使用列表推导创建一个新列表:

>>> a = [[9, 9], [8, 8], [7, 7], [6, 6], [4, 4], [5, 5], [12, 12], [15, 15], [2, 2], [3, 3]]
>>> b = [[4, 4], [5, 5]]
>>> s = {tuple(x) for x in b}
>>> [x for x in a if tuple(x) not in s]
[[9, 9], [8, 8], [7, 7], [6, 6], [12, 12], [15, 15], [2, 2], [3, 3]]

以上具有 O(n) 时间复杂度,因为检查集合中的成员资格是 O(1) 而仅使用列表具有 O(n^2) 时间复杂度,因为列表中的成员资格测试是 O(n)。请注意,它仅在列表中的项目为 hashable 时才有效。

【讨论】:

  • 所有这些都是检查集合而不是列表中的成员资格。 OP 已经几乎完全尝试过这个,并说它“不起作用”(出于某种未指明的原因)。
  • @TigerhawkT3 这就是重点,使用set 进行成员资格检查的时间复杂度为 O(1),而列表为 O(n) .在答案中添加了关于时间复杂性的简短解释以强调这一点。
  • 如果您知道“重点”是什么,请告诉我。 OP 只是说他们尝试过的“不起作用”。我不知道他们的意思是它产生错误、结果不正确、太慢还是什么。
猜你喜欢
  • 1970-01-01
  • 2013-09-20
  • 2022-11-13
  • 1970-01-01
  • 2016-11-06
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多