我有两个列表,想要逐项比较这些列表。 例如:
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
我觉得这个实现有点简单。
我想知道其他有效完成任务的方法。
(有效性意味着时间复杂度或空间复杂度)
我有两个列表,想要逐项比较这些列表。 例如:
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
我觉得这个实现有点简单。
我想知道其他有效完成任务的方法。
(有效性意味着时间复杂度或空间复杂度)
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)。
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]
呢?这不会说没有匹配,但实际上有三个吗? - Kevina, 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
b
中的a
当前元素,因此它的实用性极为有限。稍微好一点的方法是 for v, flag in map(lambda i:(i, i in b), a):
if flag: #do stuff with v
等等。 - PM 2Ring
a
和b
仍然是列表。创建common_elements
对a
和b
没有影响;在执行该行代码之前,它们的类型和内容与之前相同。 - Kevin