2014-04-12 27 views

回答

13

collections.Counter實際上是一個字典,他們依靠散列技術,所以我們實在無法按順序訪問它們。由於無法按順序訪問,因此對字典進行排序是不成問題的。但是你可以將它轉換爲對應於鍵和值的元組列表,然後對其進行排序。例如,

print(Counter('abracadabra').most_common()) 
# [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)] 
print(sorted(Counter('abracadabra').most_common(), key=lambda x: (-x[1], x[0]))) 
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)] 

我們做sorted排序most_common給出的(key, value)數據。我們要確保物品必須按value遞減排序,並按key遞增排序。所以,我們在這裏使用一個小技巧。 sorted將調用我們通過的函數作爲key參數的值,用於序列中要排序的每個元素。該函數返回的值將用於在與其他元素進行比較時表示該特定元素。在我們的例子中,key功能是這樣的

lambda x: (-x[1], x[0]) 

這裏,x將得到所有元素最終和它交換第一和第二元素的位置和否定實際計數的一部分。因爲,默認情況下,sorted按升序對數據進行排序,所以我們使最大的數字最小,反之亦然。例如,

[2, 3, 1] 

如果你想他們升序排列,該sorted將保持在開始時最小的元素,並在第二位置的下一個最小等等,直到它達到最大的元素。在我們的案例中,它變成了[1, 2, 3]。要按降序排列元素,我們使它們的否定值代表實際的數字。

sorted([2, 3, 1], key=lambda x: -x) 

現在,當sorted精選2,它調用key函數來獲取要使用的值,它會返回-2並以同樣的方式,1-13-3。它將在開始時放置最小的元素。由於我們得到了-3 3,因此我們會在開始時輸入3,2將會在它旁邊,1會在它之後。所以結果變成[3, 2, 1]

我們應用相同的技術,根據元素中的兩個項目進行排序。我們首先根據計數值進行降序排序,如果它們匹配基於鍵的排序,則升序。