【问题标题】:Comparing two lists item by item逐项比较两个列表
【发布时间】:2016-03-06 18:07:10
【问题描述】:

我有 2 个列表,我想逐项比较这些列表。 例如:

a = [1,2,3]
b = [2,3,1]
for i in a:
    if i in b:
        pass # do something
    else:
        pass # do something else instead

我觉得这个实现有点琐碎。

我想知道其他有效完成任务的方法。
(效率意味着时间复杂度或空间复杂度)

【问题讨论】:

    标签: python list python-3.x if-statement for-loop


    【解决方案1】:

    我们可以使用一个临时数组来检查a 的每个元素是否存在于b 中。这个数组的大小应该大于两个列表中可以存在的最大元素(我google了一下,32位系统中Python列表的最大大小是536,870,912,所以这个方法适用于正常情况)。这个临时列表temp_b 最初将每个元素都为零。现在,对于列表 b 中存在的所有整数,我们将该索引处的值初始化为 1,表示该元素存在于 b 中。在这之后我们要做的就是:对于a中的每个元素i,检查是否temp_b[i] == 1?如果是,则元素存在,否则不存在。

    请注意,要检查a 中每个元素的频率是否也与b 匹配,我们将不得不修改此代码。复杂度将与数组的大小成线性关系。

    a = [2, 5, 4, 7, 6, 8, 9]
    b = [1, 3, 6, 7, 4, 3, 0]
    
    temp_b = [0]*20
    
    for i in b:
        temp_b[i] = 1
    
    #to check whether each element of a is present in b or not
    for i in a:
        if temp_b[i] == 1:
            #element is present
            print "present"
        else:
            #element is not present
            print "not present"
    

    编辑:此方法仅适用于正整数。

    【讨论】:

    • 如果a[1,2,3,4]b[1,2,3] 怎么办?这不会导致IndexError 吗?如果a[1,2,3,4]b[0,1,2,3] 呢?这不是说有零匹配,实际上有三个吗?
    • 是的,你是对的,也许我只是根据给出的值来判断你的问题。
    【解决方案2】:
    a, b = [1, 2, 3], [2, 3, 1]
    for i in map(lambda i:i in b,a):
        if i == True:
            # do someting
        else:
            # do other
    

    【讨论】:

    • 您应该尝试解释您的解决方案,而不仅仅是发布代码。
    • @Ketul 如果你能解释你的答案会非常有帮助
    • 这段代码不能让你访问a 的当前元素,它在b 中,所以它的用处非常有限。 for v, flag in map(lambda i:(i, i in b), a): if flag: #do stuff with v 等会稍微好一点。
    【解决方案3】:

    您可以使用集合来查找ab 的共同元素。

    common_elements = set(a) & set(b)
    for item in a:
        if item in common_elements:
            pass # do something 
        else: 
            pass # do something else instead
    

    一般情况下,集合构造是 O(N),集合成员测试是 O(1),使得整个算法总共 O(N)。相比之下,列表的成员资格测试是 O(N),因此您的原始算法是 O(N^2)。

    【讨论】:

    • 谢谢。我很欣赏您的解决方案,但我无法将列表转换为集合。我只需要处理列表
    • @KshitijSaraogi:你为什么不能使用集合?你使用的是真的旧版本的 Python 吗?如果你不能使用集合,那么你就会坚持使用 O(n^2) 算法......除非你实现自己的哈希表,否则以 Python 速度而不是使用 Python 获得的 C 速度运行会很慢设置。
    • @PM2Ring 我正在处理一些对象的列表,我想在其他几个地方使用这些列表。此外,我个人不喜欢为操作进行类型转换。
    • 为了清楚起见,列表并没有被“转换”为集合,因为ab 不再是列表。创建common_elements对a和b没有影响;它们与执行该行之前的类型和内容相同。
    • @Kevin 感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多