举例如下:

 from functools import cmp_to_key
persons = [
{
'name':'zhangsan',
'age':20,
'grade':98
},
{
'name':'lisi',
'age':18,
'grade': 88
},
{
'name':'wangwu',
'age':20,
'grade': 20
},
{
'name': 'yanqing',
'age': 15,
'grade': 20
},
{
'name': 'awu',
'age': 20,
'grade': 20
},
] def cmp(a,b):
# 如果返回的是一个大于0的值,那么代表a>b
# 如果返回的是一个小于0的值,那么代表a<b
# 如果返回的是一个等于0的值,那么代表a=b
if a['grade'] > b['grade']:
return 1 elif a['grade'] < b['grade']:
return -1
else:
if a['age'] > b['age']:
return 1
elif a['age'] < b['age']:
return -1
else:
if a['name'] > b['name']:
return 1
else:
return -1
persons.sort(key=cmp_to_key(cmp))
new_persons = sorted(persons,key=cmp_to_key(cmp))
print(persons)
print(new_persons)

针对sort(key=cmp_to_key(cmp))及函数cmp所产生的作用尝试分析。

如下:

Sort(*,key=None,reverse = False)

sort()接受两个只能通过关键字传递的参数(关键字参数):

key指定一个参数的函数,该函数用于从每个列表元素中提取一个比较键(例如,key=str.lower)。对列表中每个项对应的键计算一次,然后用于整个排序过程。None的默认值意味着列表项是直接排序的,不需要计算单独的键值。

可以使用functools.cmp_to_key()实用程序来转换2。将cmp函数样式设置为关键函数。

functools.cmp_to_keyfunc 

将旧式比较函数(old-style comparison function)转换为关键函数(key function)。使用接受关键函数的工具(如sorted()min(), max()heapq.nlargest()heapq.nsmallest(), itertools.groupby())。此函数主要用作从Python 2转换的程序的转换工具,它支持使用比较函数。

比较函数是任何可调用的,它接受两个参数,对它们进行比较,并返回一个负数表示小于,零表示相等,或者一个正数表示大于。键函数是一个可调用的函数,它接受一个参数并返回另一个值作为排序键使用。

key function

关键函数或排序函数是可调用的,它返回用于排序或排序的值。例如,使用local .strxfrm()生成一个排序键,该键知道特定于区域设置的排序约定。

Python中的许多工具接受关键函数来控制元素的排序或分组方式(A number of tools in Python accept key functions to control how elements are ordered or grouped)。它们包括min()max(), sorted()list.sort()heapq.merge(), heapq.nsmallest()heapq.nlargest(),和 itertools.groupby()

有几种方法可以创建关键函数。为例。low()方法可以作为区分大小写排序的关键函数。或者,可以从一个lambda表达式构建一个关键函数,例如r:(r[0], r[2])。此外,运算符模块还提供了三个关键的函数构造函数:attrgetter()、itemgetter()和methodcaller()。

最后总结:

# sort是对列表进行排序
# key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序,每次排序前调用
# cmp_to_key 将比较函数转换为关键字函数
# cmp 自定义比较函数 比较函数类似于制定了比较规则。

Python_sort函数结合functools.cmp_to_key(func)分析的更多相关文章

  1. Python标准库: functools (cmp_to_key, lru_cache, total_ordering, partial, partialmethod, reduce, singledispatch, update_wrapper, wraps)

    functools模块处理的对象都是其他的函数,任何可调用对象都可以被视为用于此模块的函数. 1. functools.cmp_to_key(func) 因为Python3不支持比较函数,cmp_to ...

  2. 31.C++-虚函数之构造函数与析构函数分析

    1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存 ...

  3. PHP 基础系列(三) 【转】PHP 函数实现原理及性能分析

    作者:HDK (百度) 前言 在任何语言中,函数都是最基本的组成单元.对于PHP的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性 ...

  4. 对线程等待函数pthread_join二级指针参数分析

    分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...

  5. php使用file函数、fseek函数读取大文件效率分析

    php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...

  6. 函数 y=x^x的分析

    关于函数 y=xx的分析: 由图像得,y在负无穷大到0图像处处不连续,故y的定义域为(0,正无穷大): 故该函数不就是y=e^(lnxx)吗? 1.定义域:我们变形一下,y=e^(xlnx),显然是0 ...

  7. Linux fork函数具体图解-同一时候分析一道腾讯笔试题

    原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...

  8. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

  9. dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析

    建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...

随机推荐

  1. 自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题

    当被重用的cell将要显示时,会调用这个方法,这个方法最大的用武之地是当你自定义的cell上面有图片时,如果产生了重用,图片可能会错乱(当图片来自异步下载时及其明显),这时我们可以重写这个方法把内容抹 ...

  2. python 基础(十一) pickle 序列化

    一.pickle序列化的操作 使用说明:可以将数据 转换成2进制 写入到文件中 或者之间返回 做到将数据原样写入 原样取出 import pickle (1) dump 写入文件中 pickle.du ...

  3. JS面向对象方法(一): 使用原生JS 实现导航栏下多级分类弹出效果

    利用二级菜单的onmouseover/out事件 重新构建一级菜单 ".hover" 样式类 代码如下: CSS部分: 在原来的目标:hover样式中 增加 .hover状态 li ...

  4. python库使用整理

    1. 环境搭建 l  Python安装包:www.python.org l  Microsoft Visual C++ Compiler for Python l  pip(get-pip.py):p ...

  5. Jasper_crosstab_measure_display a value of field in crosstab total row

    1.create a measure <measure name="myField" class="java.lang.String"> <m ...

  6. git reflog查看所有操作记录

    git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录 具体一个例子, ...

  7. 正则表达式匹配URL——给URL地址加上<a> 链接

    <?php function replace_url ($content) { if (empty($content)) return; //给URL地址加上 <a> 链接 $pre ...

  8. Nginx pathinfo模式配置

    正常配置 location ~ \.php$ { fastcgi_pass ; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $docu ...

  9. MySql数据库的相关操作

    SQL(Structred Query Language)结构化查询语言:和数据库交互的语言,进行数据库管理的语言. 一.数据库的操作: 1.查询所有数据库: show databases; 2.创建 ...

  10. Java jar包查询下载方法

    做过java开发的工程师,对java应用所需jar包一定不会陌生.特别是有需要搭建开发环境时,对各种jar包的需求量就会很大. 如何快速的找到自己想要的jar包,是蛮多java工程师所面临的一个难题. ...