{{ cat }}'s docs

1.4.1 字典排序-operator.itemgetter


1. operator.itemgetter

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进行排序


2. 使用operator.itemgetter给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)]

3. 来个复杂点的数据结构

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进行排序


4. 来个更复杂的数据结构

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’的值进行排序