针对多个列表检查列表项,如果存在于任何列表中则删除。蟒蛇

时间:2014-05-01 16:16:07

标签: python list search if-statement

我有一个主要列表,例如:

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)

但很明显,只要一个条件为真,这就会退出循环,如何让循环遍历所有条件?

3 个答案:

答案 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)

现在的问题是你在列表中进行三次搜索以删除项目。随着列表或搜索列表的增长,这将变得更加耗时。在您的示例中,搜索列表中存在重复项。

组合搜索列表将减少比较次数。