簡體   English   中英

如何在 Python 的列表中找到第一個、第二個、第三個最高值

[英]How to find the 1st, 2nd, 3rd highest values in a list in Python

我知道如何找到第一個最高值,但不知道 rest。請記住,我需要打印第一個、第二個和第三個最高值的 position。謝謝並盡量保持簡單,因為我只是在編碼2個月。 他們也可以是聯合隊伍

def linearSearch(Fscore_list):
    pos_list = []
    target = (max(Fscore_list))
    for i in range(len(Fscore_list)):
        if Fscore_list[i] >= target:
            pos_list.append(i)


        return pos_list

這將打印 3 個最高項目的列表,每個項目與其索引配對:

lst = [9,7,43,2,4,7,8,5,4]
print( sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )[:3] )

如果同一個值可以出現多次(這將顯示一個值的最高位置),事情會更復雜一些:

lst = [9,7,43,2,4,7,8,5,4]
ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )
values = []
posns = []
for x,i in ranks:
    if x not in values:
        values.append( x )
        posns.append( i )
        if len(values) == 3:
            break
print zip( values, posns )

使用heapq.nlargest

>>> import heapq
>>> [i
...     for x, i
...     in heapq.nlargest(
...         3,
...         ((x, i) for i, x in enumerate((0,5,8,7,2,4,3,9,1))))]
[7, 2, 3]

將列表中的所有值添加到一個集合中。 這將確保您只擁有每個值一次。

對集合進行排序。

在原始列表中查找集合中前三個值的索引。

有道理?

編輯

thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
theset = frozenset(thelist)
theset = sorted(theset, reverse=True)

print('1st = ' + str(theset[0]) + ' at ' + str(thelist.index(theset[0])))
print('2nd = ' + str(theset[1]) + ' at ' + str(thelist.index(theset[1])))
print('3rd = ' + str(theset[2]) + ' at ' + str(thelist.index(theset[2])))

編輯

您仍然沒有告訴我們如何處理“聯合贏家”,但查看您對其他答案的回應,我猜這可能是您想要做的,也許? 如果這不是您想要的輸出,請給我們一個您希望獲得的輸出示例。

thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
theset = frozenset(thelist)
theset = sorted(theset, reverse=True)
thedict = {}
for j in range(3):
    positions = [i for i, x in enumerate(thelist) if x == theset[j]]
    thedict[theset[j]] = positions

print('1st = ' + str(theset[0]) + ' at ' + str(thedict.get(theset[0])))
print('2nd = ' + str(theset[1]) + ' at ' + str(thedict.get(theset[1])))
print('3rd = ' + str(theset[2]) + ' at ' + str(thedict.get(theset[2])))

輸出

1st = 103 at [8, 9]
2nd = 88 at [2, 5]
3rd = 45 at [1, 4]

順便說一句:如果所有值都相同(首先相等)或由於其他原因沒有第三位怎么辦? (或第二名?)。 你需要防范嗎? 如果你這樣做了,那么我相信你可以制定適當的安全防護來添加到代碼中。

代碼工作的 Jupyter 圖像這個問題在我的 Udemy 機器學習課程中出現得太早了。 Scott Hunter 在這個問題上幫了我最大的忙,但沒有讓我通過網站。 必須真正深入思考我自己的問題。 這是我的解決方案,因為在網上其他任何地方都找不到它——就我理解正在發生的一切而言*:

lst = [9,7,43,2,4,7,8,9,4]
ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )
box = []
for x,i in ranks:
    if i&x not in box:
        box.append( x )
        if len(box) == 3:
            break
print(box)

所以我們有一個數字列表。 為了對數字進行排序,當我們枚舉/迭代列表時,我們根據每個具有值的位置的位置對值進行排序。 然后我們通過反轉它來將最高值放在上面。 現在我們需要一個盒子來放置我們的信息以便稍后取出,所以我們構建了這個盒子 []。 現在,對於每個具有位置的值,如果值和位置尚未在框中,則將其放入框中——這意味着如果值已在框中,但位置不在框中,則仍將其放入框中。 我們只想要三個答案。 最后告訴我名為 box 的變量中有什么。 *這篇文章中的許多答案很可能會奏效。

如果值可以重復出現在您的列表中,您可以嘗試此解決方案。

def search(Fscore_list, num=3):
    l = Fscore_list
    res = dict([(v, []) for v in sorted(set(l), reverse=True)[:num]])
    for index, val in enumerate(l):
        if val in res:
            res[val].append(index)
    return sorted(res.items(), key=lambda x: x[0], reverse=True)

首先它找到num=3最高值,並為它的索引創建一個空list dict 接下來,它遍歷列表,並為每個最高值( val in res )保存它的索引。 然后只返回排序的元組列表,如[(highest_1, [indexes ...]), ..] 例如

>>> l = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4]
>>> print(search(l))
[(43, [2, 6]), (9, [0]), (8, [7, 9])]

要打印職位,請執行以下操作:

>>> Fscore_list = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4, 43, 43, 43]
>>> result = search(Fscore_list)
>>> print("1st. %d on positions %s" % (result[0][0], result[0][1]))
1st. 43 on positions [2, 6, 11, 12, 13]
>>> print("2nd. %d on positions %s" % (result[1][0], result[1][1]))
2nd. 9 on positions [0]
>>> print("3rd. %d on positions %s" % (result[2][0], result[2][1]))
3rd. 8 on positions [7, 9]

有一個復雜的 O(n) 算法,但最簡單的方法是對其進行排序,即 O(n * log n),然后取頂部。 這里最棘手的部分是在保留索引信息的同時對數據進行排序。

from operator import itemgetter

def find_top_n_indices(data, top=3):
    indexed = enumerate(data)  # create pairs [(0, v1), (1, v2)...]
    sorted_data = sorted(indexed, 
                         key=itemgetter(1),   # sort pairs by value 
                         reversed=True)       # in reversed order
    return [d[0] for d in sorted_data[:top]]  # take first N indices

data = [5, 3, 6, 3, 7, 8, 2, 7, 9, 1]
print find_top_n_indices(data)  # should be [8, 5, 4]

類似地,它可以通過heapq.nlargest() ,但您仍然需要將初始數據打包成元組並在之后解包。

要過濾列表並按降序返回並刪除重復項,請嘗試使用此函數。 您可以傳入您希望它作為關鍵字參數返回的降序值。

還要注意的是,如果關鍵字參數 (ordered_nums_to_return) 大於列表的長度,它將按降序返回整個列表。 如果您需要它來引發異常,則可以向該函數添加檢查。 如果沒有傳遞參數,它將返回最高值,如果需要,您可以再次更改此行為。

list_of_nums = [2, 4, 23, 7, 4, 1]


def find_highest_values(list_to_search, ordered_nums_to_return=None):
    if ordered_nums_to_return:
        return sorted(set(list_to_search), reverse=True)[0:ordered_nums_to_return]
    return [sorted(list_to_search, reverse=True)[0]]

print find_highest_values(list_of_nums, ordered_nums_to_return=4)
Input : [4, 5, 1, 2, 9] 
        N = 2
Output :  [9, 5]

Input : [81, 52, 45, 10, 3, 2, 96] 
        N = 3
Output : [81, 96, 52]
# Python program to find N largest 
# element from given list of integers 
  
l = [1000,298,3579,100,200,-45,900] 
n = 4
  
l.sort() 
print(l[-n:]) 

輸出:

[298, 900, 1000, 3579]
lst = [9,7,43,2,4,7,8,9,4]

temp1 = lst 
print(temp1)
    
#First Highest value: 
print(max(temp1))
temp1.remove(max(temp1))

#output: 43

# Second Highest value:
print(max(temp1))
temp1.remove(max(temp1))

#output: 9
    
        
# Third Highest Value:
print(max(temp1))

#output: 7

在一行中:

lst = [9,7,43,2,8,4]

index = [i[1] for i in sorted([(x,i) for (i,x) in enumerate(lst)])[-3:]]
print(index)
[2, 0, 1] 

None總是被認為小於任何數字。

>>> None<4
True
>>> None>4
False

查找最高元素及其索引。 將其替換為None 找到新的最高元素及其索引。 這將是原始列表中的第二高。 將其替換為None 找到新的最高元素,實際上是第三個。

可選:將找到的元素恢復到列表中。

這是 O(最高元素數 * 列表大小),因此如果您的“三個”增長,它的擴展性很差,但現在它是 O(3n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM