[英]Python: How to find mode (1st col - object), grouped by 2nd col, output into 3rd col
[英]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.