Câu trả lời:
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
sẽ cho bạn biết chỉ mục của phiên bản đầu tiên của phần tử có giá trị lớn nhất của danh sách a
.
Câu trả lời được chọn (và hầu hết các câu trả lời khác) yêu cầu ít nhất hai lần đi qua danh sách.
Đây là một giải pháp vượt qua có thể là lựa chọn tốt hơn cho danh sách dài hơn.
Đã chỉnh sửa: Để giải quyết hai thiếu sót được chỉ ra bởi @John Machin. Đối với (2) tôi đã cố gắng tối ưu hóa các thử nghiệm dựa trên xác suất xuất hiện của từng điều kiện và suy luận được cho phép từ những người tiền nhiệm. Đó là một chút khó khăn để tìm ra các giá trị khởi tạo thích hợp max_val
và max_indices
hoạt động cho tất cả các trường hợp có thể, đặc biệt là nếu max xảy ra là giá trị đầu tiên trong danh sách - nhưng tôi tin rằng bây giờ nó đã làm được.
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
[]
như quảng cáo ("Danh sách trả lại"). Mã nên đơn giản if not seq: return []
. (2) Sơ đồ kiểm tra trong vòng lặp là tối ưu phụ: trung bình trong các danh sách ngẫu nhiên, điều kiện val < maxval
sẽ là phổ biến nhất nhưng đoạn mã trên có 2 bài kiểm tra thay vì một.
==
thay vì 2 - elif
điều kiện của bạn sẽ luôn đúng.
elif
bản thân mình, FWIW. ;-)
Tôi đã đưa ra những điều sau đây và nó hoạt động như bạn có thể thấy max
, min
và các chức năng khác trên các danh sách như sau:
Vì vậy, hãy xem xét danh sách ví dụ tiếp theo tìm ra vị trí tối đa trong danh sách a
:
>>> a = [3,2,1, 4,5]
Sử dụng máy phát điện enumerate
và đúc
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
Tại thời điểm này, chúng ta có thể trích xuất vị trí tối đa với
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Những điều trên cho chúng ta biết, tối đa là ở vị trí 4 và giá trị của anh ta là 5.
Như bạn thấy, trong key
đối số, bạn có thể tìm thấy tối đa trên bất kỳ đối tượng lặp lại nào bằng cách xác định lambda thích hợp.
Tôi hy vọng rằng nó đóng góp.
PD: Như @PaulOurr đã ghi chú trong một bình luận. Với Python 3.x
sự min
và max
cho phép một từ khóa mới default
mà tránh được những ngoại lệ tăng ValueError
khi đối số là danh sách trống.max(enumerate(list), key=(lambda x:x[1]), default = -1)
Tôi không thể tái tạo hiệu suất đập @ SilentGhost được trích dẫn bởi @martineau. Đây là nỗ lực của tôi với sự so sánh:
=== 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
Kết quả từ một máy tính xách tay cũ chạy Python 2.7 trên 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
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
Đó là cách tôi thường làm.
Bạn cũng có thể sử dụng gói numpy:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
Điều này sẽ trả về một mảng numpy của tất cả các chỉ mục có chứa giá trị tối đa
nếu bạn muốn biến nó thành một danh sách:
maximum_indices_list = maximum_indices.tolist()
Ngoài ra, một giải pháp, chỉ cung cấp sự xuất hiện đầu tiên , có thể đạt được bằng cách sử dụng numpy
:
>>> import numpy as np
>>> a_np = np.array(a)
>>> np.argmax(a_np)
9
@shash đã trả lời điều này ở nơi khác
Một cách Pythonic để tìm chỉ mục của phần tử danh sách tối đa sẽ là
position = max(enumerate(a), key=lambda x: x[1])[0]
Mà không ai vượt qua . Tuy nhiên, nó chậm hơn giải pháp của @Silent_Ghost và, thậm chí còn hơn thế, @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
Đây là giá trị tối đa và các chỉ mục xuất hiện tại:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> 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]
>>> for i, x in enumerate(a):
... d[x].append(i)
...
>>> k = max(d.keys())
>>> print k, d[k]
55 [9, 12]
Sau này: vì sự hài lòng của @SilentGhost
>>> from itertools import takewhile
>>> import heapq
>>>
>>> def popper(heap):
... while heap:
... yield heapq.heappop(heap)
...
>>> 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]
>>> h = [(-x, i) for i, x in enumerate(a)]
>>> heapq.heapify(h)
>>>
>>> largest = heapq.heappop(h)
>>> indexes = [largest[1]] + [x[1] for x in takewhile(lambda large: large[0] == largest[0], popper(h))]
>>> print -largest[0], indexes
55 [9, 12]
heapq
- việc tìm kiếm tối đa sẽ là chuyện nhỏ.
heapq
giải pháp của bạn , tôi nghi ngờ nó sẽ hoạt động.
Ý tưởng tương tự với một sự hiểu biết danh sách nhưng không có liệt kê
m = max(a)
[i for i in range(len(a)) if a[i] == m]
a[i]
cuộc gọi.
Chỉ một dòng:
idx = max(range(len(a)), key = lambda i: a[i])
Nếu bạn muốn lấy các chỉ số của n
số lớn nhất trong danh sách được gọi data
, bạn có thể sử dụng Pandas sort_values
:
pd.Series(data).sort_values(ascending=False).index[0:n]
import operator
def max_positions(iterable, key=None, reverse=False):
if key is None:
def key(x):
return x
if reverse:
better = operator.lt
else:
better = operator.gt
it = enumerate(iterable)
for pos, item in it:
break
else:
raise ValueError("max_positions: empty iterable")
# note this is the same exception type raised by max([])
cur_max = key(item)
cur_pos = [pos]
for pos, item in it:
k = key(item)
if better(k, cur_max):
cur_max = k
cur_pos = [pos]
elif k == cur_max:
cur_pos.append(pos)
return cur_max, cur_pos
def min_positions(iterable, key=None, reverse=False):
return max_positions(iterable, key, not reverse)
>>> L = range(10) * 2
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> max_positions(L)
(9, [9, 19])
>>> min_positions(L)
(0, [0, 10])
>>> max_positions(L, key=lambda x: x // 2, reverse=True)
(0, [0, 1, 10, 11])
Mã này không phức tạp như các câu trả lời được đăng trước đó nhưng nó sẽ hoạt động:
m = max(a)
n = 0 # frequency of max (a)
for number in a :
if number == m :
n = n + 1
ilist = [None] * n # a list containing index values of maximum number in list a.
ilistindex = 0
aindex = 0 # required index value.
for number in a :
if number == m :
ilist[ilistindex] = aindex
ilistindex = ilistindex + 1
aindex = aindex + 1
print ilist
ilist trong đoạn mã trên sẽ chứa tất cả các vị trí của số lượng tối đa trong danh sách.
Bạn có thể làm điều đó theo nhiều cách khác nhau.
Cách thông thường cũ là,
maxIndexList = list() #this list will store indices of maximum values
maximumValue = max(a) #get maximum value of the list
length = len(a) #calculate length of the array
for i in range(length): #loop through 0 to length-1 (because, 0 based indexing)
if a[i]==maximumValue: #if any value of list a is equal to maximum value then store its index to maxIndexList
maxIndexList.append(i)
print(maxIndexList) #finally print the list
Một cách khác mà không tính toán độ dài của danh sách và lưu trữ giá trị tối đa cho bất kỳ biến nào,
maxIndexList = list()
index = 0 #variable to store index
for i in a: #iterate through the list (actually iterating through the value of list, not index )
if i==max(a): #max(a) returns a maximum value of list.
maxIndexList.append(index) #store the index of maximum value
index = index+1 #increment the index
print(maxIndexList)
Chúng ta có thể làm điều đó theo cách Pythonic và thông minh! Sử dụng hiểu danh sách chỉ trong một dòng,
maxIndexList = [i for i,j in enumerate(a) if j==max(a)] #here,i=index and j = value of that index
Tất cả các mã của tôi là trong Python 3.