Python中列表(list)、字典(dict)排序的程序

Python3 中的排序,在 Sorting HOW TO 中已经讲得很清楚了。来个实际的例子,对下面的这个 list 依据创建时间排序:

pages = [
{‘title‘: ‘十年学会程序设计‘, ‘time‘: ‘2012-02-14‘, ‘name‘: ‘21-days‘},
{‘title‘: ‘ANE Toolkit‘, ‘time‘: ‘2012-06-07‘, ‘name‘: ‘anetoolkit‘},
{‘title‘: ‘cocos2d-x-filters‘, ‘time‘: ‘2015-05-06‘, ‘name‘: ‘cocos2d-x-filters‘},
{‘title‘: ‘我的Firefox插件‘, ‘time‘: ‘2006-05-23‘, ‘name‘: ‘firefox-addons‘},
{‘title‘: ‘Flash&Flex大全‘, ‘time‘: ‘2005-11-02‘, ‘name‘: ‘flashassistant‘},
{‘title‘: ‘提问的智慧‘, ‘time‘: ‘2005-10-08‘, ‘name‘: ‘howtoask‘},
{‘title‘: ‘Linux软件‘, ‘time‘: ‘2009-04-30‘, ‘name‘: ‘linux-software‘},
{‘title‘: ‘Platform ANEs‘, ‘time‘: ‘2013-08-22‘, ‘name‘: ‘platform-anes‘},
{‘title‘: ‘阅读‘, ‘time‘: ‘2015-03-03‘, ‘name‘: ‘read‘},
{‘title‘: ‘Sprite Sheet Editor‘, ‘time‘: ‘2011-08-18‘, ‘name‘: ‘sprite_sheet_editor‘},
{‘title‘: ‘SpriteSheetPacker‘, ‘time‘: ‘2011-04-19‘, ‘name‘: ‘spritesheetpacker‘},
{‘title‘: ‘WordPress大全‘, ‘time‘: ‘2006-03-07‘, ‘name‘: ‘wordpressfavorite‘},
{‘title‘: ‘WPCMD‘, ‘time‘: ‘2015-06-12‘, ‘name‘: ‘wpcmd‘}
]
首先,排序需要一个可以比较的对象,我使用键名为 index 中的对象:

from datetime import date

for item in pages:
t = item[‘time‘].split(‘-‘)
item[‘index‘] = date(int(t[0]), int(t[1]), int(t[2]))
date 的实例是可比较的(它实现了 __lt__ 那一套方法), date(2012,2,14) < data(2005, 11, 2) == False 。

然后,对 pages 调用 sort 方法:

pages.sort(key=lambda item : item[‘index‘])
在这里,我需要为 key 传递一个函数,这个函数能返回需要比较的值。

当然,也可以使用 operator 提供的 itemgetter 方法来获取这个待比较的值。

from operator import itemgetter
names.sort(key=itemgetter(‘index‘))
除了 itemgetter 之外, operator 模块还提供了 attrgetter 和 methodcaller 。

张贺 对上面提到的 Sorting Mini-HOW TO 做了一些必要的中文评注,该文和 Sorting HOW TO 基本相同。

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

通过使用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}
]
根据任意的字典字段来排序输入结果行是很容易实现的,代码示例:

from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter(‘fname‘))
rows_by_uid = sorted(rows, key=itemgetter(‘uid‘))
print(rows_by_fname)
print(rows_by_uid)
代码的输出如下:

[{‘fname‘: ‘Big‘, ‘uid‘: 1004, ‘lname‘: ‘Jones‘},
{‘fname‘: ‘Brian‘, ‘uid‘: 1003, ‘lname‘: ‘Jones‘},
{‘fname‘: ‘David‘, ‘uid‘: 1002, ‘lname‘: ‘Beazley‘},
{‘fname‘: ‘John‘, ‘uid‘: 1001, ‘lname‘: ‘Cleese‘}]
[{‘fname‘: ‘John‘, ‘uid‘: 1001, ‘lname‘: ‘Cleese‘},
{‘fname‘: ‘David‘, ‘uid‘: 1002, ‘lname‘: ‘Beazley‘},
{‘fname‘: ‘Brian‘, ‘uid‘: 1003, ‘lname‘: ‘Jones‘},
{‘fname‘: ‘Big‘, ‘uid‘: 1004, ‘lname‘: ‘Jones‘}]
itemgetter()函数也支持多个keys,比如下面的代码

rows_by_lfname = sorted(rows, key=itemgetter(‘lname‘,‘fname‘))
print(rows_by_lfname)
会产生如下的输出:

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

讨论
在上面例子中,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()等函数。比如:

>>> min(rows, key=itemgetter(‘uid‘))
{‘fname‘: ‘John‘, ‘lname‘: ‘Cleese‘, ‘uid‘: 1001}
>>> max(rows, key=itemgetter(‘uid‘))
{‘fname‘: ‘Big‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1004}
>>>

排序不支持原生比较的对象

内置的 sorted() 函数有一个关键字参数 key ,可以传入一个 callable 对象给它, 这个 callable 对象对每个传入的对象返回一个值,这个值会被 sorted 用来排序这些对象。 比如,如果你在应用程序里面有一个User实例序列,并且你希望通过他们的user_id属性进行排序, 你可以提供一个以User实例作为输入并输出对应user_id值的 callable 对象。比如:

class User:
def __init__(self, user_id):
self.user_id = user_id

def __repr__(self):
return ‘User({})‘.format(self.user_id)

def sort_notcompare():
users = [User(23), User(3), User(99)]
print(users)
print(sorted(users, key=lambda u: u.user_id))
另外一种方式是使用 operator.attrgetter() 来代替lambda函数:

>>> from operator import attrgetter
>>> sorted(users, key=attrgetter(‘user_id‘))
[User(3), User(23), User(99)]
>>>

讨论
选择使用lambda函数或者是 attrgetter() 可能取决于个人喜好。 但是,attrgetter() 函数通常会运行的快点,并且还能同时允许多个字段进行比较。 这个跟 operator.itemgetter() 函数作用于字典类型很类似(参考1.13小节)。 例如,如果User实例还有一个first_name和last_name属性,那么可以向下面这样排序:

by_name = sorted(users, key=attrgetter(‘last_name‘, ‘first_name‘))
同样需要注意的是,这一小节用到的技术同样适用于像 min() 和 max() 之类的函数。比如:

>>> min(users, key=attrgetter(‘user_id‘)
User(3)
>>> max(users, key=attrgetter(‘user_id‘)
User(99)
>>>

时间: 2024-10-13 03:11:32

Python中列表(list)、字典(dict)排序的程序的相关文章

python中列表 元组 字典 集合的区别

列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复项的.如果我们扩大清单的范围,统计我们过去一周所有的花费情况,那么这也是一个清单,但这个清单里会有类别不同的项,比如我们买东西是一种花费,交水电费也是一种花费,这些项的类型是可以使不同的.pyt

python中列表,字典等必须要注意的事项

1.python中的列表不能够遍历删除 1 #python列表我们不能够遍历删除 2 li = [1, 2, 3, 4, 5, 6] 3 for i in range(len(li)): 4 print(i) 5 del li[i] 6 print(li) 7 # 输出结果: 8 # Traceback (most recent call last): 9 # 0 10 # [2, 3, 4, 5, 6] 11 # File "C:/Users/XZB/PycharmProjects/s1/da

python中常用的字典内建函数

1.len(mapping)        返回映射的长度(键-值对的个数) 2.hash(obj)              返回obj的哈希值 >>> myDict = {'name':'earth', 'port':'80'} >>> len(myDict) 2 >>> hash('name') 15034981 3.dict.copy()            返回字典(浅复制)的一个副本 >>> myDict = {'nam

Python中列表的一些方法

Python中列表的常用内置方法 1.向列表的后面追加  list.append() 2. 清空列表 list.clear() 3. 列表复制 list.copy( )  深复制 list.deepcopy() 4. 扩展原列表 list.extend() 5. 获取当前值索引的位置 list.index()  左边的优先找到 6.在列表的指定位置插入指定的元素 list.insert(index,value) 7.删除列表的某个下标值 list.pop()  --通过下标删除 8.删除列表中的

python中的sort、sorted排序

我们通常会遇到对数据库中的数据进行排序的问题,今天学习一下对列表和字典的排序方法. 列表 第一种:内建方法sort sort()对列表排序是永久性的排序. 用法:sort(*, key=None, reverse=False) 注意这个reverse.当reverse为True时,代表反向排列:默认为False,正向排列. 举例: 1 >>> d = ['3', '4', '1', '6', '2', '5'] 2 >>> d.sort() 3 >>>

Python中的list,tuple,dict和set

List list的创建与检索 Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 构造list非常简单,直接用 [ ] 把list的所有元素都括起来,就是一个list对象. Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据: 例如: >>> L = ['Michael', 100, True] list索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索

Python中字符串List按照长度排序 - python

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 下面看下字符串List按照长度排序(python)的实现方法 myList = ['青海省','内蒙古自治区','西藏自治区','新疆维吾尔自治区','广西壮族自治区'] 1.首先得到每个字符串长度 2.排序,选择sorted或者 list.sort()进行排序 内置sorted返回一个新的列表,而list.sort是对列表进行操作 sorted(iterable, cmp=None, key=None, rever

python中列表的应用

本文主要介绍了:python中列表的主要应用和一些列表自带的一些函数 代码: #!/usr/bin/env python# author by lh# -*- coding:utf-8 -*- name_list=['al','ed','fg']print name_list #打印列表 print name_list[0] #索引 print name_list[0:2] #切片 for i in name_list: #for循环打印 print i name_list.append('ed

python中列表(list)函数及使用

序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加,乘,检查成员. 此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法. 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可