2.3.7 使用函数itemgetter()对字典进行排序

在Python程序中,如果存在一个字典列表,如何根据一个或多个字典中的值来对列表进行排序呢?建议使用operator模块中的内置函数itemgetter()。函数itemgetter()的功能是获取对象中指定域的值,参数为一些序号(即需要获取的数据在对象中的序号)。以下实例文件wei.py的功能是获取对象中指定域的值。

源码路径:daima\第2章\wei.py

from operator import itemgetter
a = [1,2,3]
b=itemgetter(1)      #定义函数b,获取对象的第1个域的值
print(b(a))
b=itemgetter(1,0)    #定义函数b,获取对象的第1个域和第0个域的值
print(b(a))

函数itemgetter()获取的不是值,而是定义一个函数,通过把该函数作用到对象上才能获取值。执行后输出:

2
(2, 1)

下面的实例文件pai.py使用函数itemgetter()排序字典中的值。

源码路径:daima\第2章\pai.py

from operator import itemgetter
①rows = [
      {'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001},
      {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002},
      {'fname': 'CCC', 'lname': 'WU', 'uid': 1004},
      {'fname': 'DDD', 'lname': 'LI', 'uid': 1003}
]
②rows_by_fname = sorted(rows, key=itemgetter('fname'))
  rows_by_uid = sorted(rows, key=itemgetter('uid'))
  print(rows_by_fname)
③print(rows_by_uid)
④rows_by_lfname = sorted(rows, key=itemgetter('lname', 'fname'))
  print(rows_by_lfname)
⑤rows_by_fname = sorted(rows, key=lambda r: r['fname'])
⑥rows_by_lfname = sorted(rows, key=lambda r: (r['fname'], r['lname']))
  print(rows_by_fname)
  print(rows_by_lfname)
⑦print(min(rows, key=itemgetter('uid')))
⑧print(max(rows, key=itemgetter('uid')))

· 在①中,定义一个保存用户信息的字典rows。

· 在②~③中,根据所有字典中共有的字段来对rows中的记录进行排序。

· 在④中,itemgetter()函数接收多个键。

· 在⑤~⑥中,使用lambda表达式代替itemgetter()函数的功能。在此提醒读者,少用lambda表达式,使用itemgetter()函数会运行得更快一些。如果需要考虑程序的性能问题,建议使用itemgetter()函数。

· 在⑦~⑧中,函数itemgetter()同样可以用于操作min()和max()函数。

执行后会输出:

[{'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}, {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002}, {'fname': 'CCC', 'lname': 'WU', 'uid': 1004}, {'fname': 'DDD', 'lname': 'LI', 'uid': 1003}]
[{'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}, {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002}, {'fname': 'DDD', 'lname': 'LI', 'uid': 1003}, {'fname': 'CCC', 'lname': 'WU', 'uid': 1004}]
[{'fname': 'DDD', 'lname': 'LI', 'uid': 1003}, {'fname': 'CCC', 'lname': 'WU', 'uid': 1004}, {'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}, {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002}]
[{'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}, {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002}, {'fname': 'CCC', 'lname': 'WU', 'uid': 1004}, {'fname': 'DDD', 'lname': 'LI', 'uid': 1003}]
[{'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}, {'fname': 'BBB', 'lname': 'ZHOU', 'uid': 1002}, {'fname': 'CCC', 'lname': 'WU', 'uid': 1004}, {'fname': 'DDD', 'lname': 'LI', 'uid': 1003}]
{'fname': 'AAA', 'lname': 'ZHANG', 'uid': 1001}
{'fname': 'CCC', 'lname': 'WU', 'uid': 1004}