python怎麼sort dictionary?
為了做一個統計的圖表, 我對python的list操作又熟悉了一點.
這是要用server蒐集到的一堆資料, 做幾張圓餅圖. 那些資料會被統計為"A發生n次, B發生m次, C發生i次, D發生j次", 以此類堆. 可能有數十到數百種, 每個的發生次數不一, 從個位數到幾千幾萬都有可能.
這樣的Data讀進來的時候, 就是以dictionary的型式. 所以大概是長成{'A': n, 'B': m, 'C': i, 'D': j}, 這個樣子. 而它的內容是沒有經過排序的. 這樣做出來的圓餅圖就會大小參差不齊的幾塊小pizza, 不太好看. 所以我想把它sort過, 然後後面幾項小的項目, 就把數字相加, 統一當作Others. 這樣視覺上可以直接看得出最重要的幾筆.
所以我需要一個function, 參數是該dictionary, 跟幾筆之後的項目要被加起來當作Others. 一開始是這麼做的.
方法一
方法二
方法三
這是要用server蒐集到的一堆資料, 做幾張圓餅圖. 那些資料會被統計為"A發生n次, B發生m次, C發生i次, D發生j次", 以此類堆. 可能有數十到數百種, 每個的發生次數不一, 從個位數到幾千幾萬都有可能.
這樣的Data讀進來的時候, 就是以dictionary的型式. 所以大概是長成{'A': n, 'B': m, 'C': i, 'D': j}, 這個樣子. 而它的內容是沒有經過排序的. 這樣做出來的圓餅圖就會大小參差不齊的幾塊小pizza, 不太好看. 所以我想把它sort過, 然後後面幾項小的項目, 就把數字相加, 統一當作Others. 這樣視覺上可以直接看得出最重要的幾筆.
所以我需要一個function, 參數是該dictionary, 跟幾筆之後的項目要被加起來當作Others. 一開始是這麼做的.
方法一
def sortbyvalue(dict, order_count): keys = [dict.keys()[0]] values = [dict.values()[0]] others_value = 0 for i in range(1, len(dict)): j = 0 for j in range(len(values)): if value[j] < dict.values()[i]: break if j == len(values) - 1 and values[j] >= dict.values()[i]: keys[j+1:j+1] = [dict.keys()[i]] values[j+1:j+1] = [dict.values()[i]] else: keys[j:j] = [dict.keys()[i]] values[j:j] = [dict.values()[i]] if len(values) > order_count: for value in values[order_count:]: others_value = others_value + value keys = keys[0:order_count] values = values[0:order_count] if others_value != 0: keys.append('Others') values.append(others_value) return (keys, values)這個落落長的function, 能看懂的人大概不多吧. 後來在網路上找到sort dictionary的方法, 於是有了方法二.
方法二
def sortbyvalue(dict, order_count): di = dict.items() di.sort(key=lambda x: x[1], reverse=True) keys = [] values = [] others_value = 0 if len(di) > order_count: for item in di[order_count:]: others_value = others_value + item[1] for i in range(min(len(di), order_count)): keys.append(di[i][0]) values.append(di[i][1]) if others_value != 0: keys.append('Others') values.append(others_value) return (keys, values)這個方法主要是改善了sort的方式, 不再是用原本的"insertion sort", 而是用內建的sort(). 不過後面的算總和跟處理list的地方, 還是很不道地. 於是又有了方法三.
方法三
def sortbyvalue(dict, order_count): di = dict.items() di.sort(key=lambda x: x[1], reverse=True) keys = [x[0] for x in di] values = [x[1] for x in di] others_value = sum(values[order_count:]) keys = keys[:order_count] values = values[:order_count] if others_values != 0: keys.append('Others') values.append(others_value) return (keys, values)我相信應該還可以再寫得更精簡一點, 不過現在這個樣子我就可以接受了.
留言