python - Python:如何获取二维数组中大多数元素的子数组的索引
问题描述
我一直在寻找最有效的方法来获取其中包含最多元素的子数组的索引。例如 :
array = [[a,b,c],[a,b],[a,b,c,d,e,f]]
我应该得到的答案是2
。
如何在不使用冗长的 for 循环过程来检查每个块的情况下获得它的索引?也没有使用 Numpy。
解决方案
>>> l = [[1,2,3], [4,5], [6,7,8,9,10]]
>>> max(enumerate(l), key=lambda sub: len(sub[1]))[0]
2
这将返回具有最大项目数(可能不止一个)的元素的最低索引。
展开正在发生的事情:
>>> list(enumerate(l))
[(0, [1, 2, 3]), (1, [4, 5]), (2, [6, 7, 8, 9, 10])]
->(索引,值)对的可迭代。
>>> max(enumerate(l), key=lambda sub: len(sub[1]))
(2, [6, 7, 8, 9, 10])
-> (index, value) 对最长的值(子列表)。
>>> max(enumerate(l), key=lambda sub: len(sub[1]))[0]
2
-> 只是索引。
更具可读性的替代方案,但在最坏的情况下需要对数据进行两次完整传递:
>>> l.index(max(l, key=len))
2
一些省力的时间安排:
In [1]: l = [[0]*i for i in range(10000)]
In [2]: %timeit max(enumerate(l), key=lambda sub: len(sub[1]))[0]
2.05 ms ± 5.95 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [3]: %timeit l.index(max(l, key=len))
791 µs ± 4.22 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
即使对于具有 10000 个元素且最后一个元素最长的列表,看起来第二个版本也更快。这可能是由于只调用了非常有效的内置函数而不是自定义的lambda
.
结论:
使用l.index(max(l, key=len))
.
(最终编辑:如果您碰巧有一个包含对象的列表,其中调用index
会触发一些非常昂贵的__eq__
检查,那么第一个版本仍然会更快。)
推荐阅读
- react-native - 反应导航错误无法解析 originModulePath
- python - 在heroku上托管的Django成为一个真正的麻烦
- c - C中的fopen排序奇怪地影响它
- python - 如何从 django.contrib.gis.gdal.GDALRaster 对象创建 gdal.Dataset 或 xarray.Dataset 对象?
- python - 读取泡菜文件时出错 - 权限错误
- java - 在 Spring Boot 中自定义异常返回空消息
- reactjs - React FluentUI 组件未更新
- anylogic - AnyLogic 校准相对约束
- ssh - gitlab 和 ssh 密钥有什么问题
- php - 使用 Wordpress 主题功能更新帖子的自定义分类