我有许多列表,其值为1
或0
,长度为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)
答案 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。