我有一个清单:
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]
Run Code Online (Sandbox Code Playgroud)
最大元素是55(位置9和12上的两个元素)
我需要找到最大值位于哪个位置.请帮忙.
nmi*_*els 276
a.index(max(a))
Run Code Online (Sandbox Code Playgroud)
将告诉你列表中最大值元素的第一个实例的索引a.
Sil*_*ost 189
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
Run Code Online (Sandbox Code Playgroud)
mar*_*eau 18
选择的答案(以及大多数其他答案)需要至少两次通过列表.
这是一个通过的解决方案,对于更长的列表可能是更好的选择.
编辑:解决@John Machin指出的两个缺陷.对于(2)我试图根据每个条件的发生概率和前辈允许的推论来优化测试.找出适当的初始化值max_val并且max_indices适用于所有可能的情况是有点棘手的,特别是如果max恰好是列表中的第一个值 - 但我相信它现在确实如此.
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
Run Code Online (Sandbox Code Playgroud)
Gre*_*een 12
还有一个解决方案,它只给出了第一个外观,可以通过使用来实现numpy:
>>> import numpy as np
>>> a_np = np.array(a)
>>> np.argmax(a_np)
9
Run Code Online (Sandbox Code Playgroud)
我无法重现@martineau引用的@ SilentGhost-beating性能.这是我的比较努力:
=== 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
Run Code Online (Sandbox Code Playgroud)
在Windows XP SP3上运行Python 2.7的老式笔记本电脑的结果:
>\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
Run Code Online (Sandbox Code Playgroud)
我提出了以下内容,它可以正常运行max,min其他功能可以通过以下列表运行:
所以,请考虑下面的例子列表中找到了位置最大列表a:
>>> a = [3,2,1, 4,5]
Run Code Online (Sandbox Code Playgroud)
使用发电机 enumerate并制作铸件
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
Run Code Online (Sandbox Code Playgroud)
在这一点上,我们可以提取的位置最大值与
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Run Code Online (Sandbox Code Playgroud)
以上告诉我们,最大值位于第4位,其值为5.
如您所见,在key参数中,您可以通过定义适当的lambda来找到任何可迭代对象的最大值.
我希望它有所贡献.
PD:正如@PaulOyster在评论中指出的那样.随着Python 3.x中min和max允许新的关键字default是避免引发异常ValueError时的说法是空列表.max(enumerate(list), key=(lambda x:x[1]), default = -1)
小智 7
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
Run Code Online (Sandbox Code Playgroud)
这就是我通常这样做的方式.
小智 6
您还可以使用numpy软件包:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
Run Code Online (Sandbox Code Playgroud)
这将返回一个包含最大值的所有索引的numpy数组
如果要将其转到列表:
maximum_indices_list = maximum_indices.tolist()
Run Code Online (Sandbox Code Playgroud)
查找最大列表元素索引的 Pythonic 方法是
Run Code Online (Sandbox Code Playgroud)position = max(enumerate(a), key=lambda x: x[1])[0]
哪一个通过了。然而,它比 @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
Run Code Online (Sandbox Code Playgroud)
>>> max(enumerate([1,2,3,32,1,5,7,9]),key=lambda x: x[1])
>>> (3, 32)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
267139 次 |
| 最近记录: |