python實現次數排序並且保持出現順序不變

2021-09-24 19:32:37 字數 1646 閱讀 2683

有乙個列表資料,現在要按照出現次數最多的來降頻排序,並且當次數相同時保持資料出場的順序不變。

如果使用c++需要採用優先佇列和字典計數,但想著python應該不需要這麼複雜吧。

#待資料 :

data = [7, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 1]

#目標資料:

ans = [5, 5, 5, 5, 3, 3, 3, 6, 6, 6, 7, 1]

使用字典來計數,然後對字典的value進行排序,最後拼接成目標陣列

"""

計數後的字典結構,在這需要用到defaultdict來構建:

dic =

之後將dic送進sorted()進行高階排序比較,採用key引數指定先按照次數比較,如果次數相同

則按照出場順序進行比較

"""data = [7,3,3,3,5,5,5,5,6,6,6,1]

def times_sort(data:list):

from collections import defaultdict

times = defaultdict(list)

for i in data:

if i not in times:

dic = sorted(times.items(), key=lambda item: (-item[1][0], item[1][1]))

res =

for (k, v) in dic:

#print(k,v)

res += [k]*v[0]

return res

print(times_sort(data))

不需要使用到字典,直接使用python中的set來去重,並且把(key, times, index)當成元組直接送進sorted函式進行高階比較就可以。

"""

原理很簡單,就是對元組(key, times, index)進行乙個多變數的排序而已

input:[(1, 1, 11), (3, 3, 1), (5, 4, 4), (6, 3, 8), (7, 1, 0)]

ouput: [(5, 4, 4), (3, 3, 1), (6, 3, 8), (7, 1, 0), (1, 1, 11)]

"""def times_sort(data:list):

value = set(data)

times =

index =

for i in value:

res =

for i in zip(value, times, index):

res = sorted(res, key=lambda x:(-x[1],x[2])) #負號表示從大到小,因為預設是從小到大

ans =

for item in res:

ans += [item[0]]*item[1]

return ans

print(times_sort(data))

python統計列表(list)中的重複項出現的次數並進行排序

python 排序 sorted 如果第乙個條件 相同 則按第二個條件排序

提公升逼格的兩個函式:setdefault 與 defaultdict

jQuery實現拖動排序並將排序結果保

最近的專案中涉及到了使用者個性化定製首頁的需求,使用者要求可以隨意拖動首頁模組的位置,來實現個性化的布局。本文講解如何使用jquery實現拖動布局並將拖動後的布局位置儲存到資料庫。demo 很多 的拖動布局的例子都是採用瀏覽器的cookie來記錄使用者拖動模組的位置,也就是說拖動後各模組的排序位置資...

python實現排序

python實現排序 1.氣泡排序 將相鄰的兩個數兩兩比較,每次外迴圈都將最大的數移到最後,氣泡排序是最慢的排序演算法,實際運用中效率最低,當數列為由小到大的有序數列時為最好情況,當由大到小時為為最壞情況。def bubble sort alist count 0 遍歷每一趟比較的次數,每走一趟能得...

python實現排序

def bubblesort list iflist none if len list 1 pass else for i in range len list for j in range len list 1 i if list j list j 1 list j list j 1 list j ...