在python中,给字典排序并画饼图

Python018

在python中,给字典排序并画饼图,第1张

#coding=utf-8

import numpy as np

import matplotlib.pyplot as plt

res= {

    11:234,

    44:565,

    22:453,

    33:767,

    55:890,

    66:67,

    77:88

    }

labels = []

fracs = []

for k,v in res.items():

    labels.append(str(k))

    fracs.append(v) 

explode = [0, 0, 0, 0]  # 0.1 凸出这部分,

plt.axes(aspect=1)  # set this , Figure is round, otherwise it is an ellipse

# autopct ,show percet

plt.pie(x=fracs, labels=labels, explode=None, autopct='%3.1f %%',

        shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6

        )

'''

labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置

autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数

shadow,饼是否有阴影

startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看

pctdistance,百分比的text离圆心的距离

patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本

'''

plt.show()

tag_sorted = sorted(tag_count.iteritems(),key = operator.itemgetter(1),reverse = True)

# tag_sorted是个列表

eg.

>>>adict = dict([(x, 10+x) for x in xrange(10)])

>>>adict

{0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}

>>>sorted(adict.iteritems())

[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)]

>>>

对于列表是没有.iteritems()方法的;后续代码可以调整为:

for i,(k,v) in enumerate(tag_sorted):

print("%d %d %d"%(k,v,i))

1.sorted函数

首先介绍sorted函数,sorted(iterable,key,reverse),sorted一共有iterable,key,reverse这三个参数。

其中iterable表示可以迭代的对象,例如可以是dict.items()、dict.keys()等,key是一个函数,用来选取参与比较的元素,reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序(从大到小),reverse=false则是顺序(从小到大),默认是reverse=false。

2.按照key排序

要对字典按照key排序,可以直接调用sorted函数。

my_dict = {'lilee':25, 'age':24, 'phone':12}

sorted(my_dict.keys())

输出结果

['age', 'lilee', 'phone']

直接使用sorted(my_dict.keys())就能按key值对字典排序,这里是按照顺序对key值进行排序的,如果想按照倒序排序的话,只需要将reverse置为true即可。

sorted(my_dcit.keys(), reverse = true)

3.按照value值排序

共有三种方法可以实现将字典按照value值进行排序

(1)key使用lambda匿名函数取value进行排序

d = {'lilee':25, 'wangyan':21, 'liqun':32, 'age':19}

sorted(d.items(), key=lambda item:item[1])

输出结果为

[('age',19),('wangyan',21),('lilee',25),('liqun',32)]

如果需要倒序则

sorted(d.items(), key=lambda item:item[1], reverse=True)

得到的结果就会是

[('liqun',32),('lilee',25),('wangyan',21),('age',19)](2)使用operator的itemgetter进行排序

import operator

sorted(d.items(), key=operator.itemgetter(1))

输出结果为

[('age',19),('wangyan',21),('lilee',25),('liqun',32)]

(3)将key和value分装成元组,再进行排序

f = zip(d.keys(), d.values())

c = sorted(f)

输出结果为

[('age',19),('wangyan',21),('lilee',25),('liqun',32)]

4.取出排序的前n个value值和key值

可以按照如下操作:

before = {"key1": 5,"key2": 6,"key3": 4,"key4": 3,

}# 排序after = dict(sorted(before.items(), key=lambda e: e[1]))print(after)

# 取出前几个, 也可以在sorted返回的list中取前几个

required_cnt = 2cnt = 0

for key, value in after.items():

cnt += 1if cnt >required_cnt:breakprint("{}:{}".format(key, value))