簡體   English   中英

為什么我的按頻率排序列表的代碼不起作用?

[英]Why doesn't my code for sorting list by frequency work?

我試圖按頻率對數字列表進行排序,但是當我嘗試斷言時,它沒有用。

所以這是我的代碼:

def frequency_sorting(numbers):
    return sorted(numbers,key=numbers.count,reverse=True)

這是不起作用的斷言

assert frequency_sorting([3, 4, 11, 13, 11, 4, 4, 7, 3]) == [4, 4, 4, 3, 3, 11, 11, 7, 13]

當我直接嘗試使用該值時,輸出如下:

[4, 4, 4, 3, 11, 11, 3, 13, 7]

我嘗試查看其他解決方案,發現以下方法有效:

sorted(sorted(numbers), key=numbers.count, reverse=True)

為什么這有效而不是我的代碼? 2個代碼有什么區別? 我不明白為什么第一個不起作用。

113都出現了兩次,您的排序功能無法打破平局。 由於 Python 的排序是穩定的,如果 A 在輸入列表中排在 B 之前,並且 A 和 B 具有相同的比較鍵,那么在sorted的輸出中 A 也排在 B 之前。

在您的情況下,在將列表傳遞給frequency_sorting之前對列表進行排序,以數字方式對您的列表進行排序。 由於排序是穩定的,當您通過frequency_sorting函數運行列表時,結果仍然是有序的。

如果您想更有效地執行此操作,可以使用Counter使用 O(n) 算法計算您的數字。 排序和列表擴展不是O(1),但它們仍然比對列表中的每個數字運行numbers.count更有效。

from collections import Counter

def frequency_sorting(numbers):
    counted = Counter(sorted(numbers))

    result = []
    for number, count in counted.most_common():
        result.extend([number] * count)

    return result

assert frequency_sorting([3, 4, 11, 13, 11, 4, 4, 7, 3]) == [4, 4, 4, 3, 3, 11, 11, 7, 13]

sorted 在內部根據指定的鍵對列表進行排序

所以基本上排序(數字,鍵=數字。計數,反向=真)

這是試圖不排序

numbers
>>
[3, 4, 11, 13, 11, 4, 4, 7, 3]

但實際上排序

[numbers.count(x) for x in numbers]
>>[2, 3, 2, 1, 2, 3, 3, 1, 2]

其中 2 對應於 11 和 3,所以只要這個數組被排序,排序不關心原始值是 11 還是 3

[編輯]

因此,使用 sorted 的解決方案將使用 sorted 兩次

sorted(sorted(numbers), key=numbers.count, reverse=True)

暫無
暫無

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

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