建议37:按需选择sort或sorted

# -*-  coding:utf-8 -*-
'''
用法:
    sorted(iterable[, cmp[, key[, reverse]]])
    s.sort([cmp[, key[, reverse]]])
    
‰‰cmp 为用户定义的任何比较函数,函数的参数为两个可比较的元素(来自iterable 或
            者list),函数根据第一个参数与第二个参数的关系依次返回-1、0 或者+1(第一个参
            数小于第二个参数则返回负数)。该参数默认值为None。
‰‰key 是带一个参数的函数,用来为每个元素提取比较值,默认为None(即直接比较每个元素)。
‰‰reverse 表示排序结果是否反转。    

sort和 sorted的区别:
1、sorted() 作用于任意可迭代的对象,而sort() 一般作用于列
2、当排序对象为列表的时候,。sorted() 函数会返回一个排序后的列表,原有列表保持不
变;而sort() 函数会直接修改原有列表,函数返回为None。
3、无论是sort() 还是sorted() 函数,传入参数key 比传入参数cmp 效率要高cmp 传入
的函数在整个排序过程中会调用多次,函数开销较大;而key 针对每个元素仅作一次处理,
因此使用key 比使用cmp 效率要高。
'''
#技巧1  对字典进行排序
import operator
phonebook = {'Linda': '7750', 'Bob': '9345', 'Carol': '5834'}
sorted_pb = sorted(phonebook.iteritems(),key=operator.itemgetter(0),reverse=True)
print sorted_pb

#技巧2 ‰多维list排序
# 分别表示学生的姓名,成绩,等级
gameresult = [['Bob',95.00,'A'],['Alan',86.0,'C'],['Mandy',82.5,'A'],
              ['Rob',86,'E']] 

# 当第二个字段成绩相同的时候按照等级从低到高排序
sorted_pb = sorted(gameresult , key=operator.itemgetter(2, 1))

#技巧3 ‰字典中混合list 排序
mydict = { 'Li': ['M',7],
'Zhang': ['E',2],
'Wang': ['P',3],
'Du': ['C',2],
'Ma': ['C',9],
'Zhe': ['H',7] }
#针对字典mydict 的value 结构[n,m] 中的m 按照从小到大的顺序排列。
sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))

#技巧4 ‰List 中混合字典排序
gameresult = [{ "name":"Bob", "wins":10, "losses":3, "rating":75.00 },
{ "name":"David", "wins":3, "losses":5, "rating ":57.00 },
{ "name":"Carol", "wins":4, "losses":5, "rating ":57.00 },
{ "name":"Patty", "wins":9, "losses":3, "rating ": 71.48 }]

#针对list 中的字典元素按照rating 和name进行排序的实现方法。
sorted(gameresult , key=operator.itemgetter("rating","name"))
原文地址:https://www.cnblogs.com/tychyg/p/4935943.html