我在python中有两个列表,它们包含点,我想从BOTH列表中删除两个列表中存在的任何排列。
我尝试编写失败的后续代码:
for indexA, pointA in enumerate(listA):
for indexB, pointB in enumerate(listB):
if isPermutation(listA[indexA],listB[indexB]):
del listA[indexA]
del listB[indexB]
这当然不会起作用,因为del
命令会创建一个新列表,而for循环将松开对两个列表的引用(更不用说它需要从python中的列表中删除O(n)) 。
当您有一个列表which are mentioned here时,有多种方法可以执行此操作。但是在使用上面依赖的两个列表时,它们似乎没有帮助。
任何人都可以提供代码/方法吗?
我关心速度。
注意:使用.append()构建列表的速度非常慢,因为它是amortized。
答案 0 :(得分:1)
我建议首先创建另一个列表,其中包含要从初始列表中删除的元素,比如listC
,然后使用列表理解来修改listA
和listB
。
例如,在获得listC之后:
listA = [a for a in listA if a not in listC]
listB = [a for a in listB if a not in listC]
答案 1 :(得分:0)
而不是像Markusian所说的那样,你可以直接创建新的listA和listB而不是使listC进行比较,并且真的不需要枚举吗?
删除枚举因为它不是真正需要的,因为它在循环中会加速它。
listC = []
listD = []
for pointA in listA:
for pointB in listB:
if not isPermutation(pointA,pointB):
listC.append(pointA)
listD.append(pointB)
else:
# fix B to look like A in new listA (listC) and listB (listD)
listC.append(pointB)
listD.append(pointB)
然后如果你愿意,你可以用新的
替换旧列表listA = listC
listB = listD
edit1:如果你真的必须避免追加,你可以这样做,虽然,它在小名单上较慢,不太确定大名单:
listC = []
listD = []
for pointA in listA:
for pointB in listB:
if not isPermutation(pointA,pointB):
# a += b is like a = a + b
listC += [pointA]
listD += [pointB]
else:
# fix B to look like A in new listA (listC) and listB (listD)
listC += [pointB]
listD += [pointB]