DrT*_*cky 3 python list-comprehension
我有一个数字,有两种值列表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)
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)
只需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个列表,那么它是最快的选项)
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |