如果您不关心元素的顺序和频率,即将列表视为无序集合,则您的解决方案可能几乎是正确的(在迭代相同列表时删除元素可能不是最佳选择),但存在两个严重的次优性。
首先,您当前每个a元素都将b的元素转换为一组。我想知道Python编译器是否可以优化重复的工作,至少您可以尝试自己做。
接下来,您不需要错误地并且平方地删除元素,只需简单地过滤它们即可。
faster_b = [frozenset(x) for x in b]
def not_in_b(list):
l = frozenset(list)
for x in faster_b:
if l <= x: return False
return True
print(list(filter(not_in_b, a)))
这个可能更快。
$ python3
Python 3.6.5 (default, May 11 2018, 04:00:52)
[GCC 8.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a=[[1,2,3,4,5,6],[7,8,9,10,11,12]]
>>> b=[[5, 9, 25, 31, 33, 36],[7,8,9,10,11,12],[10, 13, 22, 24, 33, 44]]
>>> faster_b = [frozenset(x) for x in b]
>>>
>>> def not_in_b(list):
... l = frozenset(list)
... for x in faster_b:
... if l <= x: return False
... return True
...
>>> print(list(filter(not_in_b, a)))
[[1, 2, 3, 4, 5, 6]]
>>> a=[[1, 1, 2, 3]]
>>> b=[[7, 3, 2, 1], [4, 5, 6]]
>>> faster_b = [frozenset(x) for x in b]
>>> print(list(filter(not_in_b, a)))
[]
>>> a=[[1, 1, 2, 3], [42, 5, 6]]
>>> print(list(filter(not_in_b, a)))
[[42, 5, 6]]
a
是[[1, 1, 2, 3]]
,而b
是[[7, 3, 2, 1], [4, 5, 6]]
,那会怎么样? - bipll