作者cccx (ccc)
看板Python
標題Re: [問題] 想請教一個問題
時間Thu Feb 10 23:13:07 2011
試著解決大量數值做sort會很慢的問題
想法: 不要全部一起sort
每次只挑一個數字出來,跟當下最大的五個數字比
所以每次最多有6個數字做sort
L = ['369','638','724','920','14','50','11','65', '920', '920']
max5 = [] # 目前最大的5個數字及位置
threshold = 0 # max5裡面最小的數值,作為篩選用
for i, str_num in enumerate(L):
num = int(str_num)
if num <= threshold: # 比前五名還小就直接跳過
continue
# 夠格的數字就可以挑戰前5大
max5.append((num, i))
max5.sort(reverse=True)
while len(max5) > 5: # 踢掉比輸的
max5.pop()
threshold = max5[-1][0] # 拿前五大裡面,最小的當篩選標準
print [x[1] for x in max5] # 印結果
※ 引述《perturb (背後有老板)》之銘言:
: 參考apua的做法稍加改變滿足DP1010以輸出重復最大值的位置
: >>> L = ['369','638','724','920','14','50','11','65', '920', '920']
: >>> Li = zip(L, range(len(L)))
: >>> Li.sort(key=lambda x:int(x[0]), reverse=True)
: >>> print [x[1] for x in Li[:5]]
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.195.30.39
→ uranusjr:這個作法比較好, 沒有要全比的狀態下用 sort 太浪費 02/11 02:11
→ juiz:怎麼大家都不愛用 numpy.argsort() 02/11 02:56
→ apua:@o@!研究一下numpy.argsort~ 02/11 15:30