python 找出数组中的最大值,python数组里找最大值

  python 找出数组中的最大值,python数组里找最大值

  如果我想要列表中的最大值,我可以写max(List),但是如果我还需要最大值的索引呢?

  我可以这样写:

  最大值=0

  对于I,枚举(列表)中的值:

  如果值最大:

  最大值=值

  指数=i

  但是在我看来很无聊。

  如果我写:

  List.index(max(List))

  然后它将遍历列表两次。

  有没有更好的办法?

  你说‘它会遍历列表两次’是什么意思?List.index(max(List))适合我。

  @mwc:它会迭代一次列表确定最大值,然后再迭代一次找到那个值的索引。

  如果有重复的最大值,list.index()会不会有问题?

  @LoganYang是的,可能有两个项目的值相同。

  如果顺序不重要,可以做类似List.sort()[-1]的东西

  我觉得公认的答案很好,但为什么不明确地做呢?我想更多的人会理解你的代码,这和人教版8是一致的:

  最大值=最大值(我的列表)

  max _ index=my _ list . index(max _ value)

  这种方法也比公认的答案快三倍:

  随机导入

  从日期时间导入日期时间

  进口经营者

  定义显式(l):

  max_val=max(l)

  max_idx=l.index(max_val)

  返回max_idx,max_val

  def隐式(l):

  max_idx,max_val=max(enumerate(l),key=operator.itemgetter(1))

  返回max_idx,max_val

  if __name__==__main__ :

  从timeit导入计时器

  t=Timer(explicit(l), from __main__ import explicit,implicit

  导入随机;导入运算符;

  l=[random . random()for _ in xrange(100)]

  print explicit:% . 2f usec/pass %(1000000 * t . time it(number=100000)/100000)

  t=Timer(implicit(l), from __main__ import explicit,implicit;

  导入随机;导入运算符;

  l=[random . random()for _ in xrange(100)]

  print implicit:% . 2f usec/pass %(1000000 * t . time it(number=100000)/100000)

  在我的电脑上运行的结果:

  显式:8.07微秒/通道

  隐式:22.86微秒/通道

  其他包:

  显式:6.80微秒/通道

  隐式:19.01微秒/通道

  没想到会更快。即使我用 L=[random . random()for _ in xrange(1000000)][2]来代替L,也更快,保证了最后一个元素最大。

  @平原小懒猪88:对于简单的数字列表,简单的方法比较快。如果您在这种情况下做得很好,我建议使用numpy.argmax(),它在我的机器上快30倍。如果列表中包含比简单数字更复杂的对象,我的答案中的方法可以变得更快。这种方法的另一个优点是它可以用于任何迭代器,而不仅仅是列表。

  @ Sven-Marnach如果我必须先把我的列表转换成一个numpy数组,numpy会更快吗?简单的[0,1,0]的例子会更快吗?

  @Sven-Marnach我刚查过。Numpy.argmax是目前最慢的方法。如果数组包含的是字符串而不是浮点数或整数,就会给出错误的答案。

  如果有重复的最大值,list.index()会不会有问题?

  @LoganYang我不这么认为。当有多个最大值时,max()只返回第一个(这是Python 3保证的),list.index()也返回第一个。

  有许多选项,例如:

  进口经营者

  index,value=max(enumerate(my_list),key=operator.itemgetter(1))

  啊,我在别的地方见过这个,但是我觉得它只返回一个值,不是元组。

  @平淡小懒猪88:key函数只是用来决定哪个元素最大。元素不会改变。

  @SvenMarnach为什么不用key=lambda e: e[1]避免导入?

  @lifebalance用itemgetter()更快,避免导入并不是一个值得追求的目标。在某些情况下,避免外部依赖是值得的,但从标准库导入不是问题。

  这个回答比@Escualo快了33倍。假设列表很大,假设已经是一个np.array()。我不得不拒绝测试运行的次数,因为测试要查看10,000,000个元素,而不是仅仅100个元素。

  随机导入

  从日期时间导入日期时间

  进口经营者

  将numpy作为np导入

  定义显式(l):

  max_val=max(l)

  max_idx=l.index(max_val)

  返回max_idx,max_val

  def隐式(l):

  max_idx,max_val=max(enumerate(l),key=operator.itemgetter(1))

  返回max_idx,max_val

  def npmax(l):

  max_idx=np.argmax(l)

  max_val=l[max_idx]

  return (max_idx,max_val)

  if __name__==__main__ :

  从timeit导入计时器

  t=Timer(npmax(l), from __main__ import explicit,implicit,NP max;

  导入随机;进口经营者;将numpy作为np导入;

  l=NP . array([random . random()for _ in xrange(10000000)])

  printNpmax: %.2f毫秒/通道% %(1000 * t . time it(number=10)/10)

  t=Timer(explicit(l), from __main__ import explicit,implicit

  导入随机;导入运算符;

  l=[random . random()for _ in xrange(10000000)]

  printExplicit: %.2f毫秒/遍% %(1000 * t . time it(number=10)/10)

  t=Timer(implicit(l), from __main__ import explicit,implicit;

  导入随机;导入运算符;

  l=[random . random()for _ in xrange(10000000)]

  printImplicit: %.2f毫秒/遍% %(1000 * t . time it(number=10)/10)

  我电脑上的结果:

  Npmax: 8.78毫秒/通道

  显式:290.01毫秒/通道

  隐式:790.27毫秒/通道

  只是澄清一下:加速只是因为numpy C实现和纯python的比较?或者有没有办法用纯python来改进@Escualo的回答?

  我不知道这有用。

  如果要使用python 3.6,可以做如下操作: l=NP . array([random . random()for _ in range(1000000)]) print(f NP max:{(1000 * t)。timeit(number=10)/10):5.2f}毫秒/遍)

  这是在2.7。

  嗯,numpy.argmax的速度似乎很惊人,直到你让它处理一个标准的python列表。那么速度介于显式和隐式版本之间。我猜np.array不只是创建一个列表,而是会在里面保存一些额外的信息——比如最小值和最大值(只是一个假设)。

  使用Python的内置库,非常简单:

  a=[2,9,-10,5,18,9]

  max(xrange(len(a)),key=lambda x: a[x])

  这告诉max使用自定义函数lambda x: a[x]来查找列表[0,1,2,len(a)],其中0实际上是2,1实际上是9,等等。

  在Python 3中,没有xrange。如果要编写同时运行Python 2和Python 3的代码,应该使用range()。

  max([(v,i) for i,v in enumerate(my_list)])

  这更好,因为除了元组之外,您还可以使它适用于其他事物。

  这到底是怎么回事?你能打破这个过程吗?

  Hi @ clabe45,它将my_list转换为tuple list (v,I),其中v是我的列表中的每一项,I是对应的索引,然后它得到值最大的元组(及其相关索引)。

  谢谢你。可以在回答里发帖吗?max怎么知道计算最大值时只考虑每个元组(v)的第一项?

  @ clabe45也许这个回复来得太晚了,但是现在我在这个帖子上遇到了其他人(和我一样)。这里:stackoverflow.com/questions/18296755/是一个解释。不是这行:‘默认情况下,max会比较第一个索引的项,如果第一个索引相同,就会比较第二个索引。’于是我尝试了list: l=[1,1,1]然后max([(v,I)代表I,v代表枚举(l)])。它给我的结果不是第一个而是最后一个:(1,2)。希望它说明:)

  @AnupamJain现在有道理了,谢谢!

  我建议一个非常简单的方法:

  将numpy作为np导入

  l=[10,22,8,8,11]

  print(np.argmax(l))

  print(np.argmin(l))

  希望能帮到你。

  max([(value,index) for index,value in enumerate(your _ list)])#如果最大值在列表中出现多次,则返回最后一次出现的索引

  如果当前最大值不止一次,并且您想要获取所有索引,

  最大值=最大值(您的列表)

  maxIndexList=[index for index,value in enumerate(your _ list)if value==max(your _ list)]

  没错。我差点贴了一个答案,但是后来我看到你在列表理解行也用了同样的逻辑解法。

  很抱歉恢复这个帖子,但我认为我的方法值得添加。

  本例中的列表名“list”

  list.sort()

  打印(列表[-1])

  这将很容易地打印出列表中的最高值!

  List.sort()根据ASCII表中项目的值对列表进行排序,因此它可以有效地从最低到最高对列表进行排序。然后我使用print(list[-1])打印列表中的最后一个值(这将是最大的数字)。

  希望这能有所帮助!

  我们不能这样得到指数。

  也许你还需要一个排序列表?

  试试这个:

  your_list=[13,352,2553,0.5,89,0.4]

  sorted_list=sorted(your_list)

  更高值索引=你的列表索引(排序列表[-1])

  尝试格式化代码,使其更具可读性。

  1.排序具有较高的时间复杂度。2.sorted_list没有索引,只有值,所以不起作用。

  以下是使用Python内置函数问题的完整解决方案:

  #创建列表

  numbers=input(输入列表中的元素。用逗号分隔每个值。不要在末尾加逗号。

  ).拆分(,)

  #将列表中的元素(视为字符串)转换为整数

  numberL=[int(element)for element in numbers]

  #用for循环遍历列表

  对于number 1中的元素:

  maxEle=max(数字1)

  index max=number 1 . index(maxEle)

  打印(maxEle)

  打印(最大索引)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: