簡體   English   中英

排序功能的自定義鍵不起作用

[英]Custom Key for Sort Function Doesn't Work

給定一個整數數組 A[],必須根據元素的頻率對 A 進行排序。 如果兩個元素的頻率相同,則較小的數字在前。

我嘗試使用以下代碼使用 sort 函數解決問題,但我的 sort() 自定義鍵似乎不起作用。 有人能告訴我這里發生了什么嗎?

'''a is the input array and n is it's sizeQ'''
def sortByFreq(a,n):
    def count(k):
        return n-a.count(k)
    a.sort(key=int)
    a.sort(key=count)
    a=list(map(str,a))
    answer=' '.join(a)
    print(answer)

對於輸入數組 [9,9,9,2,5],代碼應該打印 9 9 9 2 5,(因為數組已經是),但它打印 2 5 9 9 9。 (我第二次調用 sort 它似乎不起作用)

問題是你不能在sort鍵中使用原始列表,因為sort使用一個不合適的位置來計算排序。

在某些時候,原來的a是空的。 不要指望像“的所有元素a都在上面”調用排序鍵時。

事實上,如果你在count方法中打印a ,你每次都會得到一個空列表。

解決方法是制作列表的副本並在排序鍵中使用它(另外:不需要傳遞列表的大小,因為len可以計算它)

def sortByFreq(a):
    def count(k):
        return len(a_copy)-a_copy.count(k)

    a_copy = a.copy()  # create a copy of the list
    a.sort(key=count)
    a=list(map(str,a))
    answer=' '.join(a)
    print(answer)

另一種方法是使用計數器預先計算元素(使用哈希,因此更快)。 請注意,您可以選擇存儲的長度a太。

def sortByFreq(a):
    def count(k):
        return n-c[k]
    c = collections.Counter(a)
    n = len(a)
    a.sort(key=count)

最后,更短的方法是使用reverse=True來簡化排序鍵,我們可以將其轉換為lambda

def sortByFreq(a):
    c = collections.Counter(a)
    a.sort(key=lambda k:c[k],reverse=True) 
def sort_by_frequency(sequence):
    """Sort sequence by frequency."""
    return ''.join(sorted([char for char in sequence], key=sequence.count, reverse=True))


if __name__ == '__main__':
    print(sort_by_frequency('92959'))

暫無
暫無

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

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