2

有两个列表,例如

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

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

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

感谢列表示例

>>>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)]
4

3 回答 3

1

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

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在确定对象是否在 set 中时明显更快,但比lists迭代其内容时要慢。

希望这可以帮助。

于 2017-03-13T05:38:55.990 回答
0

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

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

于 2017-03-13T05:38:08.813 回答
0
[obj for obj in a if obj not in b]
于 2017-03-13T05:39:57.887 回答