我试图创建一个返回数组中最大元素的函数,我觉得我有正确的代码,但我的语法顺序错误,我试图使用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
但我觉得它仍然不正确
答案 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]
它应该有用。