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

DrT*_*cky 3 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)
Run Code Online (Sandbox Code Playgroud)

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

例如输入/输出(仅显示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) 
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 6

只需zip一起列出,并应用all压缩结果,看看它是否都是非零(如果列表中的两个元素都是"真实的".如果是这样的话,问题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))
Run Code Online (Sandbox Code Playgroud)

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

Variant:自all(t)评估以来1,代码可以缩短一点,我们甚至可以map在这里使用以避免循环:

num_overlap = sum(map(all,zip(list1,list2)))
Run Code Online (Sandbox Code Playgroud)

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

2.3228490352630615 (gencomp)
2.1401889324188232 (map)
Run Code Online (Sandbox Code Playgroud)

建议的解决方案使用sum(x and y for x,y in zip(list1,list2))速度更快,因为调用没有任何开销all

1.9283719062805176
Run Code Online (Sandbox Code Playgroud)

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

  • 稍微更易读的版本(个人):`sum(x和y代表x,y代表zip(list1,list2))`. (3认同)