python从另一个列表中删除列表

时间:2017-03-13 05:32:19

标签: python list set frozenset

有两个列表,如

[[A, A], [B, B], [C, C], [D, D]]

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

如何从结果为[[C, C], [D, D]]的1中删除列表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)]

3 个答案:

答案 0 :(得分:1)

如果订单对您不是很重要,sets要快得多。所以你可以试试这个,它会比列表更快。

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

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

并尝试使用difference方法:

  

返回包含但不在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

希望这有帮助。

答案 1 :(得分:0)

只需将要删除的项目转换为元组集合,然后使用list comprehension创建新列表:

>>> 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时才有效。

答案 2 :(得分:0)

himBH