在Python中返回数组中最大元素的索引

时间:2015-01-03 14:26:19

标签: python arrays

我试图创建一个返回数组中最大元素的函数,我觉得我有正确的代码,但我的语法顺序错误,我试图使用for / while循环以便这样做。到目前为止,我有以下内容:

def manindex(arg):

    ans = 0

    while True:
    for i in range (len(arg)):
        if arg[i] > arg[ans]:
            pass

            ans = i

    return ans

如果有人能提供一些指导,不知道我哪里出错了,谢谢

编辑:所以它一直在指出我造成了一个无限循环所以如果我拿出while语句我就离开

def manindex(arg):

ans = 0

for i in range (len(arg)):
 if arg[i] > arg[ans]:

ans = i

return ans

但我觉得它仍然不正确

6 个答案:

答案 0 :(得分:5)

当你说数组我认为你的意思是Python中的 list 时,你根本不需要for / loop或while / loop来实现这一点。

您还可以将索引 max 一起使用,如下所示:

xs.index(max(xs))

样品:

xs = [1,123,12,234,34,23,42,34]

xs.index(max(xs))
3

答案 1 :(得分:1)

您可以将max参数设置为key时使用seq.__getitem__

def argmax(seq):
    return max(range(len(seq)), key=seq.__getitem__)

print(argmax([0,1,2,3,100,4,5]))

产量

4

答案 2 :(得分:1)

找到最大索引的想法总是相同的,迭代数组的元素,与我们目前的最大值进行比较,如果它更好,那么当前元素的索引现在是最大值,如果它不是,我们一直在寻找它。

enumerate方法

def max_element_index(items):
    max_index, max_value = None, None
    for index, item in enumerate(items):
        if item > max_value:
             max_index, max_value = index, item
    return max_index

功能方法

def max_element_index(items):
    return reduce(lambda x,y: x[1] > y[1] and x or y, 
                  enumerate(items), (None, None))[0]

冒着看起来神秘的风险,功能方法使用reduce函数,该函数采用两个元素并决定减少什么。这些元素是元组(索引,元素),它们是enumerate函数的结果。

在lambda主体上定义的reduce函数需要两个元素并返回最大的元组。由于reduce函数减少直到遇到结果中只有一个元素,champion是包含最大元素和最大元素索引的元组,所以我们只需要访问元组的0索引即可元素。

另一方面,如果列表为空,则返回None对象,该对象在reduce函数的第三个参数上被授予。

答案 3 :(得分:1)

在我写一篇冗长的解释之前,让我给你解决方案:

index, value = max(enumerate(list1), key=lambda x: x[1])

一行,高效(单通O(n)),可读(我认为)。

说明

一般来说,尽可能多地使用python强大的内置函数是个好主意。

在这种情况下,两个关键功能是enumerate()max()


enumerate()将列表(或实际上任何可迭代的)转换为索引和值序列。 e.g。

>>> list1 = ['apple', 'banana', 'cherry']
>>> for tup in enumerate(list1):
...     print tup
...
(0, 'apple')
(1, 'banana')
(2, 'cherry')


max()采用iterable并返回最大元素。遗憾的是,max(enumerate(list1))不起作用,因为max()将根据enumerate()创建的元组的第一个元素进行排序,这可能是索引。

max()的一个鲜为人知的特征是它可以采用max(list1, key=something)形式的第二个参数。键是一个可以应用于列表中每个值的函数,该函数的输出用于确定最大值。我们可以使用此功能告诉max()它应该按每个元组的第二项排序项,这是列表中包含的值。

enumerate()max()key结合使用(加上lambda的一些帮助来创建一个返回元组的第二个元素的函数),为您提供此解决方案。

index, value = max(enumerate(list1), key=lambda x: x[1])

我最近想到了这一点(并且在我的代码中随处可见),观看了Raymond Hettinger关于Transforming Code into Beautiful, Idiomatic Python的谈话后,他建议从你的代码中驱逐for i in xrange(len(list1)):模式。

或者,不使用lambda(谢谢@sweeneyrod!):

from operator import itemgetter
index, value = max(enumerate(list1), key=itemgetter(1))

答案 4 :(得分:0)

你可以尝试这样的事情。如果列表为空,则该函数将返回错误。

m设置为列表的第一个元素,然后我们迭代列表,比较每一步的值。

def findMax(xs):
    m = xs[0]
    for x in xs:
        if x > m:
            m = x
    return m

findMax([])#错误 findMax([1])#1 findMax([2,1])#2

如果您想使用for循环并使其更通用,那么:

def findGeneric(pred, xs):
    m = xs[0]
    for x in xs:
        if pred(x,m):
            m = x
    return m

findGeneric(lambda a,b: len(a) > len(b), [[1],[1,1,1,1],[1,1]])#[1,1,1,1]

答案 5 :(得分:0)

我相信如果你将for循环更改为....

for i in range (len(arg)):
    if arg[i] > ans:
        ans = arg[i]

它应该有用。