我有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
我发现这个实现有点小事。
我想了解有效完成任务的其他方法 (效率意味着时间复杂性或空间复杂性)
答案 0 :(得分:3)
您可以使用集来查找a
和b
的常见元素。
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