python 从另一个列表中删除列表
python delete list from another list
有两个列表
[[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]]
form要求写我已经试过的,OK,在下面
尝试一:(不行,而且里面有循环)
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)]
只需将要删除的项目转换为元组集,然后使用列表推导式创建新列表:
>>> 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.
时才有效
如果顺序对您来说不是很重要,sets
速度会快得多。所以你可以试试这个,它会比列表更快。
a=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']]
a={tuple(i) for i in a}
并尝试使用difference
方法:
return new set with elements in a but not in 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 实现会自动调整散列 table 的大小,因此速度可以保持不变 O(1)
。
Sets
在确定一个对象是否在 set 中要快得多,但在迭代其内容时比 lists
慢。
希望这对您有所帮助。
[obj for obj in a if obj not in b]
有两个列表
[[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]]
form要求写我已经试过的,OK,在下面 尝试一:(不行,而且里面有循环)
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)]
只需将要删除的项目转换为元组集,然后使用列表推导式创建新列表:
>>> 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.
时才有效如果顺序对您来说不是很重要,sets
速度会快得多。所以你可以试试这个,它会比列表更快。
a=[['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D']]
a={tuple(i) for i in a}
并尝试使用difference
方法:
return new set with elements in a but not in 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 实现会自动调整散列 table 的大小,因此速度可以保持不变 O(1)
。
Sets
在确定一个对象是否在 set 中要快得多,但在迭代其内容时比 lists
慢。
希望这对您有所帮助。
[obj for obj in a if obj not in b]