python二维列表转字典1001python二维列表转字典_python字典列表通过某个关键字排序一个字典列表...

本文详细介绍了如何使用Python的operator模块的itemgetter函数对字典列表进行排序,包括单字段排序、多字段排序以及性能优化。通过示例展示了如何根据fname、uid等字段对网站会员信息列表进行排序并提供了lambda表达式的替代方案。
摘要由CSDN通过智能技术生成

通过某个关键字排序一个字典列表

解决方案:

通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结构。 假

设你从数据库中检索出来网站会员信息列表,并且以下列的数据结构返回:

rows = [

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},

{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}

]

根据

任意的字典字段来排序输入结果行是很容易实现的,代码示例:

# encoding:utf-8

# usr/bin/python

from operator import itemgetter

rows = [

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},

{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}

]

rows_by_fname = sorted(rows, key=itemgetter('fname'))

rows_by_uid = sorted(rows, key=itemgetter('uid'))

print(rows_by_fname)

print(rows_by_uid)

代码输出如下:

[{'lname': 'Jones', 'uid': 1004, 'fname': 'Big'}, {'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}, {'lname': 'Beazley', 'uid': 1002, 'fname': 'David'}, {'lname': 'Cleese', 'uid': 1001, 'fname': 'John'}]

[{'lname': 'Cleese', 'uid': 1001, 'fname': 'John'}, {'lname': 'Beazley', 'uid': 1002, 'fname': 'David'}, {'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}, {'lname': 'Jones', 'uid': 1004, 'fname': 'Big'}]

itemgetter() 函数也支持多个keys,比如下面的代码

rows_by_lfname = sorted(rows, key=itemgetter('lname', 'fname'))

print(rows_by_lfname)

会产生如下的输出:

[{'lname': 'Beazley', 'uid': 1002, 'fname': 'David'}, {'lname': 'Cleese', 'uid': 1001, 'fname': 'John'}, {'lname': 'Jones', 'uid': 1004, 'fname': 'Big'}, {'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}]

讨论

在上面例子中, rows 被传递给接受一个关键字参数的 sorted() 内置函数。 这个参数是

callable 类型,并且从 rows 中接受一个单一元素,然后返回被用来排序的值。

itemgetter() 函数就是负责创建这个 callable 对象的。

operator.itemgetter() 函数有一个被rows中的记录用来查找值的索引参数。可以是一个

字典键名称, 一个整形值或者任何能够传入一个对象的 __getitem__() 方法的值。 如果

你传入多个索引参数给 itemgetter() ,它生成的 callable 对象会返回一个包含所有元素

值的元组, 并且 sorted() 函数会根据这个元组中元素顺序去排序。 但你想要同时在几个

字段上面进行排序(比如通过姓和名来排序,也就是例子中的那样)的时候这种方法是很有

用的。

itemgetter() 有时候也可以用 lambda 表达式代替,比如:

rows_by_fname = sorted(rows, key=lambda r: r['fname'])

rows_by_lfname = sorted(rows, key=lambda r: (r['lname'], r['fname']))

这种方案也不错。但是,使用 itemgetter() 方式会运行的稍微快点。因此,如果你对性

能要求比较高的话就使用 itemgetter() 方式。

这节中展示的技术也同样适用于 min() 和 max() 等函数。比如:

print (min(rows, key=itemgetter('uid')))

print (max(rows, key=itemgetter('uid')))

输出字典列表uid最小的一组和最大的一组

{'lname': 'Cleese', 'uid': 1001, 'fname': 'John'}

{'lname': 'Jones', 'uid': 1004, 'fname': 'Big'}

最后,列表字典的排序可以生成一种方法:

def mysortedByKeyList(dict_list, dict_key, rev=False):

"""列表字典按字典里面的列表key来排序

@param dict_list: list字典列表

@param dict_key: list字典排序的key列表(dict_list可不存在该key)

@param rev:bool 是否倒序,Flase为升序,True为降序"""

dict_list.sort(key=lambda x: tuple(x.get(ca) for ca in dict_key), reverse=rev)

return dict_list

调用:

dict_key = ["lname", "fname"] # 需要根据的key列表进行排序,支持某些不存在的key字典列表进行排序

print mysortedByKeyList(rows, dict_key)

输出

[{'lname': 'Beazley', 'uid': 1002, 'fname': 'David'}, {'lname': 'Cleese', 'uid': 1001, 'fname': 'John'}, {'lname': 'Jones', 'uid': 1004, 'fname': 'Big'}, {'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值