逐项比较两个列表

时间:2015-12-02 13:18:39

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

我有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

我发现这个实现有点小事。

我想了解有效完成任务的其他方法 (效率意味着时间复杂性或空间复杂性)

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

我们可以使用临时数组来检查a中是否存在b的每个元素。这个数组的大小应该大于两个列表中可以存在的最大元素(我用Google搜索了32位系统中Python列表的最大大小 536,870,912 ,因此这个方法可以在正常情况)。此临时列表temp_b最初将使每个元素等于零。现在,对于列表b中的所有整数,我们将该索引处的值初始化为1,表示该元素存在于b中。在此之后我们所要做的就是:对于i中的每个元素a,检查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"

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

答案 2 :(得分:0)

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