我有一个主要列表,例如:
mainlst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
我希望在这个mainlst中搜索多个其他搜索列表中的每个项目,如果它们存在于其中任何一个中以将其从主列表中删除,那么例如:
searchlst1 = ['a', 'b', 'c']
searchlst2 = ['a', 'd', 'f']
searchlst3 = ['e', 'f', 'g']
我遇到的问题是我无法弄清楚如何使循环遍历每个语句,所以如果我使用if elif
语句,它会在找到匹配后立即退出循环
for item in mainlst:
if item in searchlst1:
mainlst.remove(item)
elif item in searchlst2:
mainlst.remove(item)
elif item in searchlst3
mainlst.remove(item)
但很明显,只要一个条件为真,这就会退出循环,如何让循环遍历所有条件?
答案 0 :(得分:1)
set
对象非常适合这样的事情 - in
运算符需要O(1)时间,而O(N)时间需要一个列表 - 并且很容易创建一个集合使用set.union
的一堆现有列表:
search_set = set().union(searchlst1, searchlst2, searchlst3)
mainlst = [x for x in mainlst if x not in search_set]
示例:
>>> search_set = set().union(searchlst1, searchlst2, searchlst3)
>>> search_set
set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
>>> mainlst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> mainlst = [x for x in mainlst if x not in search_set]
>>> mainlst
['h']
答案 1 :(得分:1)
如何使用列表推导和集合:
[i for i in mainlst if i not in set(searchlst1 + searchlst2 + searchlst3)]
返回['h']
set()
采用可迭代(在本例中为一组列表)并返回包含唯一值的set
。对集合中成员资格的测试总是花费相同的时间,而对列表中成员资格的测试则与列表的长度成线性比例。
列表理解遍历mainlst
的每个元素,并构建一个新成员列表,其成员不在set
中:
>>> mainlst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> search = set(searchlst1 + searchlst2 + searchlst3)
>>> search
set(['a', 'c', 'b', 'e', 'd', 'g', 'f'])
>>> [i for i in mainlst if i not in search]
['h']
答案 2 :(得分:0)
用if语句替换elif语句将解决您的问题。
for item in mainlst:
if item in searchlst1:
mainlst.remove(item)
if item in searchlst2:
mainlst.remove(item)
if item in searchlst3:
mainlst.remove(item)
现在的问题是你在列表中进行三次搜索以删除项目。随着列表或搜索列表的增长,这将变得更加耗时。在您的示例中,搜索列表中存在重复项。
组合搜索列表将减少比较次数。