例如 [1,2,3,4,1,2]
最小元素为 1,但它最后一次出现在索引 4 处。
>>> values = [1,2,3,4,1,2]
>>> -min((x, -i) for i, x in enumerate(values))[1]
4
无需修改原始列表,适用于任意迭代,并且只需要一次通过。
这将创建一个可迭代的元组,其中第一个值是列表中的原始元素,第二个元素是否定索引。当在这个元组的可迭代中找到最小值时,将首先比较值,然后是索引,因此您最终将得到一个 (min_value,lowest_negative_index) 的元组。通过从这个元组中取出第二个元素并再次否定它,您可以获得最小值的最高索引。
这是一个非常相似的替代版本,但使用了一个关键功能min()
:
>>> min(range(len(values)), key=lambda i: (values[i], -i))
4
请注意,此版本仅适用于序列(列表、元组、字符串等)。
len(list_) - list_[::-1].index(min(list_)) - 1
获取列表的长度,从中减去反向列表中列表的最小值的索引,然后减去 1。
a = [1,2,3,4,1,2]
a.reverse()
print len(a) - a.index(min(a)) - 1
评论后更新:
可以通过再次反转来消除副作用(但当然这是非常低效的)。
a.reverse()
效率不高(我是 Python 的初学者),但也能正常工作。idx 将只保存最小元素的最后一个索引。我认为 M.Keijzers 方法是最好的。
array = [1,2,3,4,1,2]
min_val = min(array)
for i in range(len(array)):
if array[i] == min_val:
idx = i
print idx
>>> from operator import itemgetter
>>> from itertools import izip,count
>>> min(izip(count(len(L)-1,-1), reversed(L)), key=itemgetter(1))[0]
4
reversed
返回遍历原始列表而不创建临时列表的迭代器:
>>> reversed(L)
<listreverseiterator object at 0x00E823B0>
izip
并且count
很懒惰,而且似乎没有字节码执行,所以我希望这个解决方案非常快,而且是单行的。
使用的解决方案index
被证明是最快的,尽管他们必须通过列表 2 次。其他解决方案在每次迭代时都会在生成器中创建辅助元组,我认为这就是这些解决方案速度较慢的原因。甚至 akson128 调用字节码执行的解决方案仍然更快(因为它不必创建元组)。
len(myList)-1 - myList[::-1].index(min(list))
这使用切片表示法list[::-1]
返回反向列表的浅表副本,因此它不会更改您的原始列表,然后搜索该列表中的最小值
>>>myList = [1,2,3,4,1,2]
>>>len(myList)-1 - myList[::-1].index(min(list))
4