如果符合条件,则从两个列表中删除项目

时间:2013-07-28 20:39:47

标签: python list time-complexity


我在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

2 个答案:

答案 0 :(得分:1)

我建议首先创建另一个列表,其中包含要从初始列表中删除的元素,比如listC,然后使用列表理解来修改listAlistB。 例如,在获得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]