Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 - Fatal编程技术网

在python中,有效地从列表中删除也在给定列表中的元素

在python中,有效地从列表中删除也在给定列表中的元素,python,list,Python,List,所以我有两个列表和一个主列表。如果主列表中的元素出现在其他两个列表中,则应删除它们 例如: s1=[1,2,3,4,7] s2=[3,4,5,6,20] mainlist=[6,7,8,9,10,11,12,13,14,15] 因此,由于mainList包含元素6和7,它们也存在于s1或s2中,因此应该将它们删除,结果如下所示 resultList = [8,9,10,11,12,13,14,15] 我的代码: 主列表[:]中j的: 如果s1中的j或s2中的j: 主列表。删除(j) 是否存

所以我有两个列表和一个主列表。如果主列表中的元素出现在其他两个列表中,则应删除它们

例如:

s1=[1,2,3,4,7]
s2=[3,4,5,6,20]
mainlist=[6,7,8,9,10,11,12,13,14,15]
因此,由于mainList包含元素6和7,它们也存在于s1或s2中,因此应该将它们删除,结果如下所示

resultList = [8,9,10,11,12,13,14,15]
我的代码:

主列表[:]中j的
:
如果s1中的j或s2中的j:
主列表。删除(j)

是否存在不使用for循环的情况?我需要一种有效的方法来降低时间复杂度。谢谢大家!

您可以使用列表理解,它可以很好地解决此类问题:

result = [x for x in mainlist if x not in s1 and x not in s2]
使用
list/set
操作,您可以执行以下操作之一

result = list(set(mainlist) - (set(s1) | set(s2)))  # remove the concat of s1&s2
result = list(set(mainlist) - set(s1) - set(s2))    # remove s1 and s2

也许您可以使用列表理解创建另一个列表

res = [i for i in test_list if i not in s1 and i not in s2]
或者使用
filter()+lambda

res = filter(lambda i: i not in s1 and i not in s2, mainlist) 
或对循环使用

for elem in mainlist:
   if elem in s1 or elem in s2:
      mainlist.remove(elem)
试试这个:

mainlist = list(set(mainlist) - (set(s1)|set(s2)))
这里我假设所有列表都没有重复的元素

您可以计时并与其他方法进行比较

time_idx = time()
result = [x for x in mainlist if x not in s1 and x not in s2]
print(time() - time_idx)
0.00012612342834472656

0.00010609626770019531


由于这是一个小列表,因此改进非常显著。

只需使用set操作即可过滤掉

>>> list(set(mainlist) - set(s1+s2))
>>> [8, 9, 10, 11, 12, 13, 14, 15]

您还可以使用计数器执行以下操作:

from collections import Counter

print(list(Counter(mainlist) - Counter(s1) - Counter(s2)))
Out[309]: [8, 9, 10, 11, 12, 13, 14, 15]

您可以将
s1
s2
转换为
dict

s1={i:i代表s1中的i}
s2={i:i代表s2中的i}
mainlist=[i代表mainlist中的i,如果i不在s1中或i不在s2中]

将列表转换为dict可能会浪费一些时间,但由于python字典基本上是哈希表,因此搜索复杂度是
O(1)
,而不是
O(n)
,与列表类似。
因此,最终不是
O(n^2)
,而是
O(n)
或类似的东西。
如果您尝试此方法,请告诉我。

您可以使用列表理解,但时间复杂性仍然存在,因为这是问题的固有属性。谢谢大家,我尝试了所有解决方案,但仍然超出了时间限制。谢谢大家,我已经尝试了所有的解决方案,但仍然超出了时间限制。你完成这项任务的时间范围是多少@SuhailPappu?我不知道这是一个在线问题contest@SuhailPappu您在没有列表切片的情况下尝试过吗?@SuhailPappu您能用此代码编辑您的问题吗?
from collections import Counter

print(list(Counter(mainlist) - Counter(s1) - Counter(s2)))
Out[309]: [8, 9, 10, 11, 12, 13, 14, 15]