Python:如何获取二维数组中元素最多的子数组的索引

2024-06-02 05:59:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找最有效的数组元素。例如:

array = [[a,b,c],[a,b],[a,b,c,d,e,f]]

我应该得到的答案是2。在

如何在不使用冗长的for loop进程检查每个块的情况下获得此索引?也没有使用Numpy。在


Tags: 答案numpyloop元素for进程情况数组
3条回答
>>> l = [[1,2,3], [4,5], [6,7,8,9,10]]
>>> max(enumerate(l), key=lambda sub: len(sub[1]))[0]
2

这将返回元素的最低索引,该索引的项目数最多(可能有多个)。

正在展开正在发生的事情:

^{pr2}$

-(索引、值)对的可伸缩(>)。

^{pr3}$

->;(索引、值)对,值最长(子列表)。

^{pr4}$

->;仅索引。

更可读的替代方案,但在最坏情况下,通过两次完整传递数据:

>>> 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个元素的列表来说,速度也更快,其中最后一个元素是最长的。这可能是因为只调用非常高效的内置函数而不是自定义^{cd1>}。

结论:

使用^{cd2>}

(最终编辑:如果您碰巧有一个列表包含对象,调用^{{cd3>}将触发一些非常昂贵的^{cd4>}检查,那么第一个版本仍然可能更快。)

有点迂回,但工作:

>>> a = [[1, 2, 3], [2, 3], [4, 5, 6, 7, 8]]
>>> max(enumerate(a), key=lambda (_, el): len(el))
(2, [4, 5, 6, 7, 8])

这将给出元素及其索引。我将把它作为一个练习留给读者,让他们找出如何将其简化为索引。在

如果您只需要元素,事情就简单得多:

^{pr2}$

如果你想简化systax

>>> array = [[a,b,c],[a,b],[a,b,c,d,e,f]]
>>> array.index(max(array, key=len))
2

相关问题 更多 >