我一直在寻找最有效的方法来获取其中包含最多元素的子数组的索引。例如:
array = [[a,b,c],[a,b],[a,b,c,d,e,f]]
我应该得到的答案是2
。
如何在不使用冗长的for循环过程检查每个块的情况下获取此索引?也不需要使用Numpy。
答案 0 :(得分:3)
>>> 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])
->(索引,值)与最长值(子列表)配对。
>>> 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__
检查,则第一个版本可能会更快。)
答案 1 :(得分:1)
稍微回旋处,但可以完成工作:
>>> 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])
这给出了元素及其索引。我将把它留给读者作为练习,以找出如何将其减少为仅索引。
如果只需要元素,则事情会简单得多:
>>> max(a, key=len)
[4, 5, 6, 7, 8]
答案 2 :(得分:1)
如果要保持简单的系统税,
>>> array = [[a,b,c],[a,b],[a,b,c,d,e,f]]
>>> array.index(max(array, key=len))
2
答案 3 :(得分:1)
我们可以使用import { Circle, G, Line, Rect, Text as TextSvg } from 'react-native-svg'
通过<TextSvg />
对lamba
进行排序,然后仅获取最后一项的索引
array