本人的代码是基于python3.6的。
有时我们想在一个字典列表中,根据某一个或多个字典中的值来对该列表字典排序。
通常有这样一个数据结构:
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1},
{'fname': 'Dacid', 'lname': 'Bee', 'uid': 7},
{'fname': 'Jone', 'lname': 'Cleece', 'uid': 5},
{'fname': 'Big', 'lname': 'Jones', 'uid': 3}
]
根据所有字典中任一共有字段是非常简单的,示例如下:
from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter('fname'))
print(rows_by_fname)
代码输出为:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 3},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1},
{'fname': 'Dacid', 'lname': 'Bee', 'uid': 7},
{'fname': 'Jone', 'lname': 'Cleece', 'uid': 5}]
itemgetter()函数还可以接受多个键。
rows_by_lname = sorted(rows, key=itemgetter('fname', 'lname'))
print(rows_by_lname)
结果输出如下:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 3},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1},
{'fname': 'Dacid', 'lname': 'Bee', 'uid': 7},
{'fname': 'Jone', 'lname': 'Cleece', 'uid': 5}]
在这个例子中,rows被传递给内置的函数sorted,该函数接受一个关键字参数key。这个参数代表一个可被调用的对象,该对象从rows中接受一个单独的元素作为输入并返回一个用来做排序依据的值。
函数operator.itemgetter()接受的参数可作为查询的标记,用来从rows的记录中提取出所需要的值。它可以是字典的键名称、用数字表示的列表元素或是任何可以传给对象的__getitem__()方法的值。
有时会用lambda表达式来取代itemgetter()功能。
rows_by_lname = sorted(rows, key=lambda r: r['lname'])
print(rows_by_lname)
同样,在特别情况下也适用max()和min()这样的函数。
rows_by_uid = min(rows, key=lambda r: r['uid'])
print(rows_by_uid)
rows_by_uid = max(rows, key=lambda r: r['uid'])
print(rows_by_uid)