我有一个工作函数,允许我搜索两个列表,看看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];
}
答案 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非常小,否则很有意义。