在Python中查找值为min或max的索引

Ste*_* Lu 22 python

我有一个形式的结构:

>>> items
[([[0, 1], [2, 20]], 'zz', ''), ([[1, 3], [5, 29], [50, 500]], 'a', 'b')]
Run Code Online (Sandbox Code Playgroud)

每个元组中的第一项是范围列表,我想创建一个生成器,它根据起始索引按升序提供范围.

由于范围列表已按其起始索引排序,因此此操作很简单:它只是一个排序合并.我希望以良好的计算效率来做到这一点,所以我认为隐式跟踪合并状态的一个好方法是简单地弹出具有最小起始索引的元组列表的前面.范围清单.

我可以min()用来获取[0, 1]我想要的第一个,但我如何得到它的索引?

我有这个:

[ min (items[i][0]) for i in range(len(items)) ]
Run Code Online (Sandbox Code Playgroud)

这给了我每个列表中的第一个项目,然后我可以min()通过某种方式,但是一旦任何列表变为空,它就会失败,并且还不清楚如何使用索引pop()而不在列表中查找它.

总结一下:想要构建为我返回的生成器:

([0,1], 'zz', '')
([1,3], 'a', 'b')
([2,20], 'zz', '')
([5,29], 'a', 'b')
([50,500], 'a', 'b')
Run Code Online (Sandbox Code Playgroud)

或者甚至更有效率,我只需要这些数据:

[0, 1, 0, 1, 1]
Run Code Online (Sandbox Code Playgroud)

(我想要采取前面项目的元组的索引)

Mat*_*ien 47

 from operator import itemgetter
 index, element = max(enumerate(items), key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

返回最大元素的索引items和元素本身.

  • `max(enumerate(items), key=lambda x: x[1])`,为您节省导入。 (4认同)

1''*_*1'' 31

此方法查找任何可迭代的最大元素的索引,并且不需要任何外部导入:

def argmax(iterable):
    return max(enumerate(iterable), key=lambda x: x[1])[0]
Run Code Online (Sandbox Code Playgroud)

  • 只有非循环解决方案才能在一次扫描中同时提供max和argmax! (2认同)

小智 13

列表最大值的索引:

def argmax(lst):
  return lst.index(max(lst))
Run Code Online (Sandbox Code Playgroud)

如果lst中存在重复的最大值,则返回找到的第一个最大值的索引.

  • 它也会迭代列表两次,所以不要这样做. (6认同)

Mik*_*ler 5

这有效:

by_index = ([sub_index, list_index] for list_index, list_item in
             enumerate(items) for sub_index in list_item[0])
[item[1] for item in sorted(by_index)]
Run Code Online (Sandbox Code Playgroud)

给出:

[0, 1, 0, 1, 1]
Run Code Online (Sandbox Code Playgroud)

详细。生成器:

by_index = ([sub_index, list_index] for list_index, list_item in
             enumerate(items) for sub_index in list_item[0])
list(by_index)    
[[[0, 1], 0], [[2, 20], 0], [[1, 3], 1], [[5, 29], 1], [[50, 500], 1]]
Run Code Online (Sandbox Code Playgroud)

因此,唯一需要做的就是排序并仅获取所需的索引:

[item[1] for item in sorted(by_index)]
Run Code Online (Sandbox Code Playgroud)


yon*_*avi 5

获取 argmax 的另一种方法是:

def argmax(lst):
    return max(range(len(lst)), key=lst.__getitem__)
Run Code Online (Sandbox Code Playgroud)