- Item 1
- Item 2
- Item 3
- 项目1
- 项目2
- 项目3
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
最大的元素为55(位置9和12上有两个元素)
我需要找出最大值位于哪些位置。请帮忙。
a.index(max(a))
会告诉你列表 a
中最大值元素的第一次出现的索引。
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
max_val
和max_indices
在所有可能的情况下都能正常工作有些棘手,特别是如果最大值恰好是列表中的第一个值-但我相信现在已经可以了。def maxelements(seq):
''' Return list of position(s) of largest element '''
max_indices = []
if seq:
max_val = seq[0]
for i,val in ((i,val) for i,val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
[]
(“返回列表”)。代码应该简单地写成 if not seq: return []
。
(2) 循环中的测试方案不够优化:在随机列表中,条件 val < maxval
通常是最常见的,但上述代码却需要进行两次测试而不是一次。 - John Machin==
的情况 - 您的elif
条件将始终为真。 - John Machinelif
。;-) - martineau>>> a = [3,2,1, 4,5]
使用生成器enumerate
并进行强制转换
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
此时,我们可以使用max的位置
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
以上告诉我们,最大值位于位置4,其值为5。
正如您所看到的,在key
参数中,您可以通过定义适当的lambda函数找到任何可迭代对象上的最大值。
希望这有所帮助。
附注:正如@PaulOyster在评论中指出的那样。 在Python 3.x
中,min
和max
允许一个新的关键字default
,它可以避免在参数为空列表时引发ValueError
异常。 max(enumerate(list), key=(lambda x:x[1]), default = -1)
default = (None, None)
设为默认值,以便在像 max_index,max_value = max(enumerate(list),key=(lambda x:x[1]),default = (None, None))
这样分配给某些变量时符合返回类型。 - rainversion_3还有一种方法可以只找到第一次出现的解决方案,这可以通过使用numpy
来实现:
>>> import numpy as np
>>> a_np = np.array(a)
>>> np.argmax(a_np)
9
我无法复现@martineau引用的@SilentGhost超越性能。以下是我的测试结果:
=== maxelements.py ===
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
b = range(10000)
c = range(10000 - 1, -1, -1)
d = b + c
def maxelements_s(seq): # @SilentGhost
''' Return list of position(s) of largest element '''
m = max(seq)
return [i for i, j in enumerate(seq) if j == m]
def maxelements_m(seq): # @martineau
''' Return list of position(s) of largest element '''
max_indices = []
if len(seq):
max_val = seq[0]
for i, val in ((i, val) for i, val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
def maxelements_j(seq): # @John Machin
''' Return list of position(s) of largest element '''
if not seq: return []
max_val = seq[0] if seq[0] >= seq[-1] else seq[-1]
max_indices = []
for i, val in enumerate(seq):
if val < max_val: continue
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
以下是在一台老旧的笔记本电脑上运行Python 2.7和Windows XP SP3系统得出的结果:
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_s(me.a)"
100000 loops, best of 3: 6.88 usec per loop
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_m(me.a)"
100000 loops, best of 3: 11.1 usec per loop
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_j(me.a)"
100000 loops, best of 3: 8.51 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_s(a100)"
1000 loops, best of 3: 535 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_m(a100)"
1000 loops, best of 3: 558 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_j(a100)"
1000 loops, best of 3: 489 usec per loop
您也可以使用numpy软件包:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
这将返回一个包含最大值的所有索引的numpy数组
如果要将其转换为列表:
maximum_indices_list = maximum_indices.tolist()
a = [32, 37, 28, 30, 37, 25, 27, 24, 35,
55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
import pandas as pd
pd.Series(a).idxmax()
9
>>> max(enumerate([1,2,3,32,1,5,7,9]),key=lambda x: x[1])
>>> (3, 32)
A Pythonic way to find the index of the maximum list element would be
position = max(enumerate(a), key=lambda x: x[1])[0]
这种方法只需要一次遍历 (one pass),但速度比@Silent_Ghost和@nmichaels的解决方案要慢。
for i in s m j n; do echo $i; python -mtimeit -s"import maxelements as me" "me.maxelements_${i}(me.a)"; done
s
100000 loops, best of 3: 3.13 usec per loop
m
100000 loops, best of 3: 4.99 usec per loop
j
100000 loops, best of 3: 3.71 usec per loop
n
1000000 loops, best of 3: 1.31 usec per loop