[英]Find 3 maximum elements of list with python
如何搜索列表的三個最大元素,並在除以 2 時將其替換為相同索引處的結果。
請問我做錯了什么:
輸入是: 2 5 8 19 1 15 7 20 11
輸出應為: 2 5 8 9.5 1 7.5 7 10 11
索引超出范圍是顯示的結果
def numberInput(line):
lineInput = [int(i) for i in line.split()]
min1 = min(lineInput)
for j in range(len(lineInput)):
if lineInput[j]>min1 and lineInput[j] > lineInput[j+1]:
max1 = lineInput[j]/float(2)
else:
max1 = lineInput[j]/float(2)
lineInput[j] = max1
lineInput[j] = max1
return(lineInput)
number = '2 5 8 19 1 15 7 20 11'
print(numberInput(number))
如果列表的順序不重要,您可以簡單地按降序對列表進行排序,然后將前 3 個元素替換為
a = [2, 5, 8, 19, 1, 15, 7, 20, 11]
a.sort(reverse = True)
a[0] = a[0] / 2
a[1] = a[1] / 2
a[2] = a[2] / 2
輸出
[10.0, 9.5, 7.5, 11, 8, 7, 5, 2, 1]
如果順序很重要,
import heapq
largest = heapq.nlargest(3, a)
for i in range(len(a)):
if a[i] in largest:
a[i] = a[i] / 2
輸出
[2, 5, 8, 9.5, 1, 7.5, 7, 10.0, 11]
heapq.nlargest()
是 heapq 的一個函數,它可以從列表中給你 n 個最大的數字。 由於 Python 中的列表沒有替換功能,因此必須遍歷列表一次,然后手動替換。 希望這能解決您的問題。
你為什么不只瀏覽一次列表(它可能代碼有點長,但絕對有效)
def numberInput(line):
lineInput = [int(i) for i in line.split()]
n = len(lineInput)
if n <= 3:
return [i / 2 for i in lineInput]
max_pairs = [(lineInput[i], i) for i in range(3)] # keep track of 3 max's and their indices
max_pairs.sort(key = lambda x: -x) # sort in descending order
for i in range(3, n):
if lineInput[i] >= max_pairs[0][0]: # greater than the largest element
max_pairs = [(lineInput[i], i)] + max_pairs[:2]
elif lineInput[i] >= max_pairs[1][0]: # greater than second element
max_pairs = [max_pairs[0], (lineInput[i], i), max_pairs[1]]
elif lineInput[i] >= max_pairs[2][0]: # greater than third element
max_pairs = max_pairs[:2] + [(lineInput[i], i)]
for pair in max_pairs:
lineInput[pair[1]] = lineInput[pair[0]] / 2
return lineInput
說明: max_pairs
是三個元組的集合,包含最多三個元素及其索引
注意:我認為以上最容易理解,但如果你不喜歡所有這些 ifs,你可以循環執行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.