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)
这将返回元素的最低索引,该索引的项目数最多(可能有多个)。
正在展开正在发生的事情:
^{pr2}$-(索引、值)对的可伸缩(>)。
^{pr3}$->;(索引、值)对,值最长(子列表)。
^{pr4}$->;仅索引。
更可读的替代方案,但在最坏情况下,通过两次完整传递数据:
一些低努力时间:
看起来第二个版本甚至对于包含10000个元素的列表来说,速度也更快,其中最后一个元素是最长的。这可能是因为只调用非常高效的内置函数而不是自定义^{cd1>}。
结论:
使用^{cd2>}。
(最终编辑:如果您碰巧有一个列表包含对象,调用^{{cd3>}将触发一些非常昂贵的^{cd4>}检查,那么第一个版本仍然可能更快。)
有点迂回,但工作:
这将给出元素及其索引。我将把它作为一个练习留给读者,让他们找出如何将其简化为索引。在
如果您只需要元素,事情就简单得多:
^{pr2}$如果你想简化systax
相关问题 更多 >
编程相关推荐