您的位置:首页 > 编程语言 > Python开发

Python中的字典排序

2014-11-12 00:03 225 查看
我想将b={'a':234,'b':1,'c':2,'e':2387}分别按照key和value进行排序,该怎样办呢?Python中比较常用的排序有两个函数,一、定义(1)一个是List数据结构中的sort>>>help(list.sort)
Helponmethod_descriptor:sort(...)
L.sort(cmp=None,key=None,reverse=False)--stablesort*INPLACE*;
cmp(x,y)->-1,0,1Thesort()methodtakesoptionalargumentsforcontrollingthecomparisons.cmpspecifiesacustomcomparisonfunctionoftwoarguments(listitems)whichshouldreturnanegative,zeroorpositivenumberdependingonwhetherthefirstargumentisconsideredsmallerthan,equalto,orlargerthanthesecondargument:cmp=lambdax,y:cmp(x.lower(),y.lower()).ThedefaultvalueisNone.keyspecifiesafunctionofoneargumentthatisusedtoextractacomparisonkeyfromeachlistelement:key=str.lower.ThedefaultvalueisNone.reverseisabooleanvalue.IfsettoTrue,thenthelistelementsaresortedasifeachcomparisonwerereversed.Ingeneral,thekeyandreverseconversionprocessesaremuchfasterthanspecifyinganequivalentcmpfunction.Thisisbecausecmpiscalledmultipletimesforeachlistelementwhilekeyandreversetoucheachelementonlyonce.Usefunctools.cmp_to_key()toconvertanold-stylecmpfunctiontoakeyfunction.Changedinversion2.3:SupportforNoneasanequivalenttoomittingcmpwasadded.Changedinversion2.4:Supportforkeyandreversewasadded.(2)内置的函数sortedsorted(iterable[,cmp[,key[,reverse]]])Returnanewsortedlistfromtheitemsiniterable.表明内置的sorted函数会生成一个新的数据表不会改变原有数据的顺序。Theoptionalargumentscmp,key,andreversehavethesamemeaningasthoseforthelist.sort()method(describedinsectionMutableSequenceTypes).cmpspecifiesacustomcomparisonfunctionoftwoarguments(iterableelements)whichshouldreturnanegative,zeroorpositivenumberdependingonwhetherthefirstargumentisconsideredsmallerthan,equalto,orlargerthanthesecondargument:cmp=lambdax,y:cmp(x.lower(),y.lower()).ThedefaultvalueisNone.keyspecifiesafunctionofoneargumentthatisusedtoextractacomparisonkeyfromeachlistelement:key=str.lower.ThedefaultvalueisNone(comparetheelementsdirectly).reverseisabooleanvalue.IfsettoTrue,thenthelistelementsaresortedasifeachcomparisonwerereversed.Ingeneral,thekeyandreverseconversionprocessesaremuchfasterthanspecifyinganequivalentcmpfunction.Thisisbecausecmpiscalledmultipletimesforeachlistelementwhilekeyandreversetoucheachelementonlyonce.Usefunctools.cmp_to_key()toconvertanold-stylecmpfunctiontoakeyfunction.二、举例

SortingBasics

>>>sorted([5,2,3,1,4])
[1,2,3,4,5]

>>>a=[5,2,3,1,4]
>>>a.sort()
>>>a
[1,2,3,4,5]

第一种使用的是内置排序方法,第二种是list的排序方法。Usuallyit'slessconvenientthansorted()-butifyoudon'tneedtheoriginallist,it'sslightlymoreefficient.(虽然第一种方法不是很方便,但是通常更有效率)

>>>sorted({1:'D',2:'B',3:'B',4:'E',5:'A'})
[1,2,3,4,5]

Anotherdifferenceisthatthelist.sort()methodisonlydefinedforlists.Incontrast,thesorted()functionacceptsanyiterable.(另外一点就是list.sort()的方法仅仅只能用作列表的数据结构,然而,sorted却可以用作任何可迭代的数据结构)

KeyFunctions

StartingwithPython2.4,bothlist.sort()andsorted()addedakeyparametertospecifyafunctiontobecalledoneachlistelementpriortomakingcomparisons(从2.4以后,新添加了key参数,通过制定一个判断函数来按照key进行排序)
>>>sorted("ThisisateststringfromAndrew".split(),key=str.lower)
['a','Andrew','from','is','string','test','This']

>>>student_tuples=[
('john','A',15),
('jane','B',12),
('dave','B',10),
]
>>>sorted(student_tuples,key=lambdastudent:student[2])#sortbyage
[('dave','B',10),('jane','B',12),('john','A',15)]

关于lambda实际上为匿名函数,后面部分会将lambda函数参数:返回值

>>>classStudent:
def__init__(self,name,grade,age):
self.name=name
self.grade=grade
self.age=age
def__repr__(self):
returnrepr((self.name,self.grade,self.age))
defweighted_grade(self):
return'CBA'.index(self.grade)/float(self.age)

>>>student_objects=[
Student('john','A',15),
Student('jane','B',12),
Student('dave','B',10),
]
>>>sorted(student_objects,key=lambdastudent:student.age)#sortbyage
[('dave','B',10),('jane','B',12),('john','A',15)]

OperatorModuleFunctions

Thekey-functionpatternsshownaboveareverycommon,soPythonprovidesconveniencefunctionstomakeaccessorfunctionseasierandfaster.Theoperatormodulehasitemgetter,attrgetter,andstartinginPython2.6amethodcallerfunction.Usingthosefunctions,theaboveexamplesbecomesimplerandfaster.通过引入operator模块有了更快的查询方式:
>>>fromoperatorimportitemgetter,attrgetter,methodcaller

>>>sorted(student_tuples,key=itemgetter(2))
[('dave','B',10),('jane','B',12),('john','A',15)]

>>>sorted(student_objects,key=attrgetter('age'))
[('dave','B',10),('jane','B',12),('john','A',15)]

Theoperatormodulefunctionsallowmultiplelevelsofsorting.Forexample,tosortbygradethenbyage:(我们不仅可以按照一种条件进行排序,我们还可以设定多个条件进行排序,如下例中的先按照班级,在按照年龄)
>>>sorted(student_tuples,key=itemgetter(1,2))
[('john','A',15),('dave','B',10),('jane','B',12)]

>>>sorted(student_objects,key=attrgetter('grade','age'))
[('john','A',15),('dave','B',10),('jane','B',12)]

AscendingandDescending(升降序)

仅仅在后面添加一个reverse就可以了
>>>sorted(student_tuples,key=itemgetter(2),reverse=True)
[('john','A',15),('jane','B',12),('dave','B',10)]

>>>sorted(student_objects,key=attrgetter('age'),reverse=True)
[('john','A',15),('jane','B',12),('dave','B',10)]

回到刚开始的地方,我们可以很轻松的写出:

importoperator
defsortDict():
b={'a':234,'b':1,'c':2,'e':2387}
print(sorted(b.iteritems(),key=operator.itemgetter(0)))#按key升序排列
print(sorted(b.iteritems(),key=operator.itemgetter(1)))#按value升序排列
print(sorted(b.items(),key=lambdax:x[1],reverse=True))##按value降序排列输出结果:[('a',234),('b',1),('c',2),('e',2387)]
[('b',1),('c',2),('a',234),('e',2387)]
[('e',2387),('a',234),('c',2),('b',1)]





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: