Python 如果项目符合条件,则从两个列表中删除项目
Python 如果项目符合条件,则从两个列表中删除项目,python,list,time-complexity,Python,List,Time Complexity,python中有两个列表,它们包含点,我想从两个列表中删除两个列表中存在的任何排列 我尝试编写以下失败的代码: for indexA, pointA in enumerate(listA): for indexB, pointB in enumerate(listB): if isPermutation(listA[indexA],listB[indexB]): del listA[indexA] del listB[in
python中有两个列表,它们包含点,我想从两个列表中删除两个列表中存在的任何排列 我尝试编写以下失败的代码:
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))。
当您有一个列表时,有多种方法可以做到这一点。但当处理两个具有上述依赖关系的列表时,它们似乎没有什么帮助
有人能提供代码/方法来实现这一点吗?
我关心速度。
注意:使用.append()构建列表的速度非常慢,因为它是一个函数。我建议首先创建另一个包含要从初始列表中删除的元素的列表,比如
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]
不用像markusian说的那样做,你可以直接创建新的listA和listB,而不用创建一个listC来进行比较,而且真的不需要enumerate,是吗 删除枚举,因为它不是真正需要的,因为它在循环中会加快一点速度
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]
你需要保持秩序吗?如果你不这样做,你应该使用集合而不是列表,计算交集并从两者中减去。我不介意更改当前顺序,但我需要保留最终顺序。也就是说,您可以对其进行排序,但必须以相同的方式对其进行排序。如果项目已经在listB中(并同时从listB中删除),您是否可以通过不将其插入listA来完全避免此问题,反之亦然?如果您确实需要维护一个重复项目的列表,那么就有一个第三个列表(ListAB),其中包含每个项目,否则这些项目将同时位于listA和listB中。@jarmod不,我不能。我不是插入它们的那个人。它们实际上是从程序的不同部分解析出来的。我会注意到它们的解析速度很快。真的很快,我不知道如何诚实,所以这不是魔术。有没有一种方法不使用
.append()
?@GuySoft就可以做到这一点,您指的是.append()
?为了创建包含要从listA和listB中删除的元素的列表,您需要以某种方式构建列表。它可以工作,但更愿意通过删除第13行和第14行的.append()
来加快速度:@GuySoft,我明白了。如果您愿意,您也可以使用列表理解来创建这些列表。例如,使用您在问题中使用的相同代码,您可以执行如下操作:removeA=[a代表列表中的a,b代表列表中的b,如果isPermutation(a,b)]
谢谢!将尝试并更新,没有足够的输入文件来测试它。我正在尝试避免.append
,因为使用它。如果必须避免.append,您可以将点转换为列表并将其与列表连接在一起,但它比.append慢…没有必要使用更慢的东西。关键是找到更快的东西。我认为这是显而易见的:-/我试图避免。追加,因为使用其摊销GuySoft 10小时前,所以我给你的不是附加lol