我们知道 Python 的内置 dictionary 数据类型是无序的, 通过 key 来获取对应的 value 可是有时我们需要对 dictionary 中 的 item 进行排序输出, 可能根据 key, 也可能根据 value 来排到底有多少种方法可以实现对 dictionary 的内容进行排序输出呢? 下面摘取了 一些精彩的解决办法
python 对容器内数据的排序有两种, 一种是容器自己的 sort 函数, 一种是内建的 sorted 函数
sort 函数和 sorted 函数唯一的不同是, sort 是在容器内 (in-place) 排序, sorted 生成一个新的排好序的容器
对于一个简单的数组 L=[5,2,3,1,4].
- (1) L.sort(), sort(comp=None, key=None, reverse=False) --> in place sort
- (2) sorted(iterable, cmp=None, key=None, reverse=False) --> return a new sorted list
- cmp specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument:
- cmp=lambda x,y: cmp(x.lower(), y.lower())
- . The default value is None.
- key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
- reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.
- In general, the key and reverse conversion processes are much faster than specifying an equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once. Use
- functools.cmp_to_key()
- to convert an old-style cmp function to a key function.
- The built-in sorted() function is guaranteed to be stable. A sort is stable if it guarantees not to change the relative order of elements that compare equal this is helpful for sorting in multiple passes (for example, sort by department, then by salary grade).
算法的稳定性, 基数排序正确性的保证, 在低位排序好后, 相同的高位排在一起, 但要保证之前的地位相对顺序不变
1 按照 Key 值排序
- # 最简单的方法, 这个是按照 key 值排序:
- def sortedDictValues1(adict):
- items = adict.items()
- items.sort()
- return [value for key, value in items]
- # 又一个按照 key 值排序, 貌似比上一个速度要快点
- def sortedDictValues2(adict):
- keys = adict.keys()
- keys.sort()
- return [dict[key] for key in keys]
- # 还是按 key 值排序, 据说更快而且当 key 为 tuple 的时候照样适用
- def sortedDictValues3(adict):
- keys = adict.keys()
- keys.sort()
- return map(adict.get, keys)
- # 一行语句搞定:
- [(k,di[k]) for k in sorted(di.keys())]
- # 用 sorted 函数的 key 参数 (func) 排序:
- # 按照 key 进行排序
- print sorted(dict1.items(), key=lambda d: d[0])
2 按照 value 值排序
- # 来一个根据 value 排序的, 先把 item 的 key 和 value 交换位置放入一个 list 中, 再根据 list 每个元素的第一个值, 即原来的 value 值, 排序:
- def sort_by_value(d):
- items=d.items()
- backitems=[[v[1],v[0]] for v in items]
- backitems.sort()
- return [ backitems[i][1] for i in range(0,len(backitems))]
- # 还是一行搞定:
- [ v for v in sorted(di.values())]
- # 用 lambda 表达式来排序, 更灵活:
- sorted(d.items(), lambda x, y: cmp(x[1], y[1])), #或反序:
- sorted(d.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)
- # 用 sorted 函数的 key 参数 (func) 排序: # 按照 value 进行排序
- print sorted(dict1.items(), key=lambda d: d[1])
3 扩展用法: Key Function:
从 Python2.4 开始, list.sort() 和 sorted() 都增加了一个 key 参数用来在进行比较之前指定每个列表元素上要调用的函数
例 1: 不区分大小写的字符串比较排序:
- >>> sorted("This is a test string from Andrew".split(), key=str.lower)
- [a, Andrew, from, is, string, test, This]
key 应该是一个函数, 其接收一个参数, 并且返回一个用于排序依据的 key 其执行效率很高, 因为对于输入记录 key function 能够准确的被调用
例 2 对于复杂的对象, 使用对象的下标作为 key:
- >>> student_tuples = [
- ... (john, A, 15),
- ... (jane, B, 12),
- ... (dave, B, 10),
- ... ]
- >>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
- [(dave, B, 10), (jane, B, 12), (john, A, 15)]
例 3 使用对象的属性进行操作:
- >>> class Student:
- ... def __init__(self, name, grade, age):
- ... self.name = name
- ... self.grade = grade
- ... self.age = age
- ... def __repr__(self):
- ... return repr((self.name, self.grade, self.age))
- >>>
- >>> student_objects = [
- ... Student(john, A, 15),
- ... Student(jane, B, 12),
- ... Student(dave, B, 10),
- ... ]
- >>> sorted(student_objects, key=lambda student: student.age) # sort by age
- [(dave, B, 10), (jane, B, 12), (john, A, 15)]
当列表里面每一个元素不止一个元素 (比如: 列表里面, 元素为元祖类型), 我们除了想对第一个关键字排序之外, 还想在第一次的基础上面根据第二个关键字进行排序:
- >>> list2 = [(d, 3), (a, 5), (d, 1), (c, 2), (d, 2)]
- >>> list2
- [(d, 3), (a, 5), (d, 1), (c, 2), (d, 2)]
- >>> list2.sort()
- >>> list2
- [(a, 5), (c, 2), (d, 1), (d, 2), (d, 3)]
- >>> list3 = [(d, 3), (a, 5), (d, 1), (c, 2), (d, 2)]
- >>> sorted(list3, key = lambda x:(x[0],x[1]))
- [(a, 5), (c, 2), (d, 1), (d, 2), (d, 3)]
参考:
python function: sorted
Python 排序 ---sort 与 sorted 学习
python dict sorted 排序
Python: sort,sorted,OrderedDict 的用法
来源: http://www.bubuko.com/infodetail-2524580.html