检索按索引重叠列表的次数

时间:2017-03-12 22:11:28

标签: python list-comprehension

我有许多列表,其值为10,长度为1024.我想找到两个给定列表在所有索引上重叠的次数(但仅限于如果它们与值== 1)匹配,但似乎无法想到保持比较次数较低的方式。目前我的方法是获取我的列表的所有索引值== 1,并得到两个列表的交集,例如

#for each list, do the following
for x,j in enumerate(list1): 
    if j == 1:
       idx_list.append(x) 
# compare  two lists 
num_overlap = set(idx_list1).intersection(idx_list2)

这是找到这个值的最有效方法吗?

例如输入/输出(仅显示6个值而不是1024个):

list1 = [1 0 1 0 0 0]
list2 = [1 0 0 0 0 0]
num_overlap = 1 (both lists have ```1``` at index 0) 

2 个答案:

答案 0 :(得分:6)

只需zip列出,并在压缩结果上应用all,看看它是否全部为非零(如果列表的两个元素都是" truthy&#34如果是这样的话,问题1。总结发电机理解。

list1 = [1,0,1,0,0,0]
list2 = [1,0,0,0,0,0]

num_overlap = sum(1 for t in zip(list1,list2) if all(t))

注意:适用于您可以提供给zip的任意数量的列表。

变体:由于all(t)评估为1,因此代码可以缩短一点,我们甚至可以在这里使用map来避免循环:

num_overlap = sum(map(all,zip(list1,list2)))

在大量迭代中对两种解决方案进行基准测试:

2.3228490352630615 (gencomp)
2.1401889324188232 (map)

使用sum(x and y for x,y in zip(list1,list2))建议的解决方案更快,因为调用all

没有任何开销
1.9283719062805176

(如果您想要推广超过2个列表,则不能使用最后一个列表,但如果您只有2个列表,那么它是最快的选项)

答案 1 :(得分:2)

如果您只对次数感兴趣,可以使用numpy数组,将它们相乘(产品是入口的),然后对产品求和。只有当两个数组中的相应条目都是1时,产品中才有1个。这是一个例子:

import numpy as np    
a=np.array([1,0,0,1])
b=np.array([1,0,1,0])
sum(a*b)

然后a * b = [1,0,0,0],sum(a * b)= 1。

相关问题