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.二、举例
Anotherdifferenceisthatthelist.sort()methodisonlydefinedforlists.Incontrast,thesorted()functionacceptsanyiterable.(另外一点就是list.sort()的方法仅仅只能用作列表的数据结构,然而,sorted却可以用作任何可迭代的数据结构)
operatormodulehasitemgetter,attrgetter,andstartinginPython2.6amethodcallerfunction.Usingthosefunctions,theaboveexamplesbecomesimplerandfaster.通过引入operator模块有了更快的查询方式:
Theoperatormodulefunctionsallowmultiplelevelsofsorting.Forexample,tosortbygradethenbyage:(我们不仅可以按照一种条件进行排序,我们还可以设定多个条件进行排序,如下例中的先按照班级,在按照年龄)
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)]
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.Use
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.The>>>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)]
相关文章推荐
- Python中最快的字典排序方法
- python天天进步(4)--字典排序
- 传说中最快的python字典排序方法
- python的排序函数sort,sorted在列表排序和字典排序中的应用详解和举例
- Python: Trie树实现字典排序
- Python中 字典排序、列表排序
- [转]python字典排序
- Python中 字典排序、列表排序
- python 字典排序
- python天天进步(3)--字典排序
- Python中 字典排序、列表排序
- python 字典排序
- python学习:读写文件和字典排序
- python 字典排序
- python字典排序
- python字典排序
- Python字典排序及简单性能测试
- python 字典排序
- Python字典排序的简单实现
- [转]python字典排序