04 Jun 2017
itemgetter可以返回一个可调用的对象,用来返回数据源的对应操作数的值
import operator f = operator.itemgetter(1, 2) # f(r)会返回(r[1], r[2]) # 对象可以是列表 l = [1, 2, 3] print(type(f(l)), f(l)) (<type 'tuple'>, (2, 3)) # 对象可以是tuple t = (1, 2, 3) print(type(f(t)), f(t)) (<type 'tuple'>, (2, 3)) # 也可以用于dict d = {'a': 1, 'b': 2, 'c': 3} fv = operator.itemgetter('c') print(type(fv(d)), fv(d)) (<type 'int'>, 3)
对于字典排序这个操作,我们可以利用dict.items返回tuple类型的特性来对dict进行排序
# 生成一个字典 from random import randint d = {x: randint(1,100) for x in 'abczyx'} print(d) {'a': 29, 'c': 19, 'b': 33, 'y': 49, 'x': 1, 'z': 24} sorted_d = sorted(d.items(), key=operator.itemgetter(1)) print(sorted_d) [('x', 1), ('c', 19), ('z', 24), ('a', 29), ('b', 33), ('y', 49)]
l = [{'a': randint(1, 10), 'b': randint(11, 20)} for x in range(3)] print(l) [{'a': 10, 'b': 13}, {'a': 3, 'b': 16}, {'a': 6, 'b': 19}] sorted_l = sorted(l, key=operator.itemgetter('a')) print(sorted_l) [{'a': 3, 'b': 16}, {'a': 6, 'b': 19}, {'a': 10, 'b': 13}]
使用list中每个元素的’a’这个key的value进行排序
l = [{'a': randint(1, 10), 'c':{'b': randint(11, 20), 'd': randint(21, 30)}} for x in range(4)] print(l) [{'a': 4, 'c': {'b': 19, 'd': 29}}, {'a': 4, 'c': {'b': 16, 'd': 25}}, {'a': 1, 'c': {'b': 16, 'd': 29}}, {'a': 6, 'c': {'b': 12, 'd': 25}}] def sort_key(i): return i['c']['b'] sorted_l = sorted(l, key=sort_key) print(sorted_l) [{'a': 6, 'c': {'b': 12, 'd': 25}}, {'a': 4, 'c': {'b': 16, 'd': 25}}, {'a': 1, 'c': {'b': 16, 'd': 29}}, {'a': 4, 'c': {'b': 19, 'd': 29}}]
使用list中每个dict中的key’c’的key‘b’的值进行排序