有效地在两个列表中查找项目

时间:2016-02-16 18:42:22

标签: python

我有一个工作函数,允许我搜索两个列表,看看list1中的项是否存在于list2中,如果list1中的list2中没有项目,那么我希望输出到另一个列表。然而,这需要AGES运行,我想知道是否有更快的方法来执行此操作。

- (void)awakeFromNib
{
    [super awakeFromNib];

    // Hide selection box in multi-select mode.
    self.multipleSelectionBackgroundView = [[UIView alloc] init];
    self.multipleSelectionBackgroundView.backgroundColor = [UIColor clearColor];
}

4 个答案:

答案 0 :(得分:3)

由于您只是检查是否包含在list2中,请将其设为一组:

def compare(list1, list2):
    s2 = set(list2)
    result = [i  for i in list1  if i not in s2] # simple list comprehension
    return result

这保留了程序的输入顺序和语义,同时明显更快:设置包含测试为O(1),而列表包含测试为O(n),使整个算法从O(n ^ 2)下降到O(n)。

答案 1 :(得分:2)

您可以使用套装。

示例:

>>> list1 = ['a', 'b', 'c']
>>> list2 = ['c', 'd', 'e']
>>> set(list1) - set(list2)
{'b', 'a'}

默认设置不保留顺序。如果订单对您很重要,请查看OrderedSet的配方。

答案 2 :(得分:1)

你能用套装吗?

就像是:

print list(set(list1)-set(list2))

但它会删除重复项。

答案 3 :(得分:1)

set1 - set2答案是正确的,如果您不介意丢失订单和重复。但即使你,如果list2很大,使用集合可以极大地提高程序的效率和可读性:

set2 = set(list2)
result = [item for item in list1 if item not in set2]

生成集合的成本为O(len(list2))。所以这种方法的运行时间为O(len(list2) + len(list1)),除非list2非常小,否则很有意义。

相关问题