Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果项目符合条件,则从两个列表中删除项目_Python_List_Time Complexity - Fatal编程技术网

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