亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按頻率對列表進行排序

按頻率對列表進行排序

慕仙森 2023-10-06 19:28:51
我想按頻率降序對列表進行排序。如果兩個值的頻率相同,那么我還希望這兩個值按降序排列。例如,mylist = [1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 5, 5, 5, 4, 4, 4, 4, 4, 4]我希望我的結果是[4,4,4,4,4,4,3,3,3,3,3,5,5,5,2,2,2,1,1].如果我使用sorted(mylist,key = mylist.count,reverse = True)我會得到[4,4,4,4,4,4,3,3,3,3,3,2,2,2,5,5,5,1,1];我試過 sorted(mylist,key = lambda x:(mylist.count,-x),reverse = True)但我認為有些問題,它只給了我結果:[1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5].所以我的問題是我怎樣才能得到我想要的結果以及為什么結果會是這樣[1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5]如果我使用sorted(mylist,key = lambda x:(mylist.count,-x),reverse = True)
查看完整描述

3 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

使用 Counter 獲取頻率,然后按它給出的頻率排序:


from collections import Counter


def sorted_by_frequency(arr):

    counts = Counter(arr)


    # secondarily sort by value

    arr2 = sorted(arr, reverse=True)


    # primarily sort by frequency

    return sorted(arr2, key=counts.get, reverse=True)


# Usage:

>>> sorted_by_frequency([1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 5, 5, 5, 4, 4, 4, 4, 4, 4])

[4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5, 5, 5, 2, 2, 2, 1, 1]


查看完整回答
反對 回復 2023-10-06
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

為什么

sorted(mylist, key=lambda x: (mylist.count, -x), reverse=True)

出錯?

它比較鍵,因此例如兩個值31成為對(mylist.count, -3)和 ,(mylist.count, -1)并且比較將是(mylist.count, -3) < (mylist.count, -1)。

因此,明顯的錯誤是這些對沒有預期的數字頻率。相反,他們有這個功能。而且功能不亞于它本身。

但我發現注意到當時到底發生了什么很有趣。配對比較是如何進行的?您可能認為這(a, b) < (c, d)相當于(a < c) or (a == c and b < d). 事實并非如此。因為這會評估mylist.count < mylist.count,然后你會因TypeError. 元組相互比較的實際方式是首先找到差異,然后通過檢查相等性來完成。而且mylist.count == mylist.count不僅不會崩潰反而會返回True。因此,元組比較會轉到下一個索引,在那里它將找到-3-1。

所以本質上你只是在做

sorted(mylist, key=lambda x: -x, reverse=True)

并且否定和reverse=True相互抵消,所以你得到相同的結果

sorted(mylist, key=lambda x: x)

要不就

sorted(mylist)

現在如何做對呢?一種方法是調用該函數(并刪除否定):

result = sorted(mylist, key=lambda x: (mylist.count(x), x), reverse=True)

或者同時否定頻率和價值,而不是reverse=True

result = sorted(mylist, key=lambda x: (-mylist.count(x), -x))

另一種方法是利用排序的穩定性并使用兩種更簡單的排序(甚至可能比一種更復雜的排序更快):

result = sorted(mylist, reverse=True)
result.sort(key=mylist.count, reverse=True)

請注意,這里我們不必調用mylist.count自己,因為它是鍵,它將為我們調用。就像你的“lambda 函數”確實被調用一樣(只是不是其結果中的函數)。另請注意,我使用sorted后跟就地sort- 沒有必要創建另一個列表并產生與之相關的成本。

collections.Counter盡管在所有情況下,對于長列表,使用 a代替會更有效mylist.count,因為后者使解決方案采用 O(n 2 ) 而不是 O(n log n)。


查看完整回答
反對 回復 2023-10-06
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

你可以試試 :


from collections import Counter


counts = Counter(mylist)

new_list = sorted(mylist, key=lambda x: (counts[x], x), reverse=True)


查看完整回答
反對 回復 2023-10-06
  • 3 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號