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