Python自定义比较器如何工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python自定义比较器如何工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1788字,纯文字阅读大概需要3分钟。
内容图文
![Python自定义比较器如何工作?](/upload/InfoBanner/zyjiaocheng/696/7f7bc55498564c9487b960f2d3549150.jpg)
我有以下Python字典:
[(2, [3, 4, 5]), (3, [1, 0, 0, 0, 1]), (4, [-1]), (10, [1, 2, 3])]
现在,我想根据字典值的总和对它们进行排序,因此对于第一个键,值的总和为3 4 5 = 12.
我写了下面的代码来完成这项工作:
def myComparator(a,b):
print "Values(a,b): ",(a,b)
sum_a=sum(a[1])
sum_b=sum(b[1])
print sum_a,sum_b
print "Comparision Returns:",cmp(sum_a,sum_b)
return cmp(sum_a,sum_b)
items.sort(myComparator)
print items
这是我在上面运行后得到的输出:
Values(a,b): ((3, [1, 0, 0, 0, 1]), (2, [3, 4, 5]))
2 12
Comparision Returns: -1
Values(a,b): ((4, [-1]), (3, [1, 0, 0, 0, 1]))
-1 2
Comparision Returns: -1
Values(a,b): ((10, [1, 2, 3]), (4, [-1]))
6 -1
Comparision Returns: 1
Values(a,b): ((10, [1, 2, 3]), (3, [1, 0, 0, 0, 1]))
6 2
Comparision Returns: 1
Values(a,b): ((10, [1, 2, 3]), (2, [3, 4, 5]))
6 12
Comparision Returns: -1
[(4, [-1]), (3, [1, 0, 0, 0, 1]), (10, [1, 2, 3]), (2, [3, 4, 5])]
现在,我无法理解比较器的工作方式,传递了两个值以及将进行多少次比较?是否在内部创建一个排序的键列表,以跟踪进行的每个比较?此外,该行为似乎是非常随机的.我很困惑,任何帮助将不胜感激.
解决方法:
数量和进行的比较没有记录,实际上,可以根据不同的实现自由更改.唯一的保证是,如果比较功能有意义,则该方法将对列表进行排序.
CPython使用Timsort algorithm对列表进行排序,因此您看到的是该算法执行比较的顺序(如果我没记错很短的列表,Timsort只是使用插入排序)
Python没有跟踪“键”.每次进行比较时,它仅调用比较功能.因此,您的函数可以调用的次数超过len(items)次.
如果要使用键,则应使用key参数.实际上,您可以执行以下操作:
items.sort(key=lambda x: sum(x[1]))
这将创建键,然后使用键上的常规比较运算符进行排序.这样可以保证只调用键传递的函数len(items)次.
鉴于您的清单是:
[a,b,c,d]
您看到的比较顺序是:
b < a # -1 true --> [b, a, c, d]
c < b # -1 true --> [c, b, a, d]
d < c # 1 false
d < b # 1 false
d < a # -1 true --> [c, b, d, a]
内容总结
以上是互联网集市为您收集整理的Python自定义比较器如何工作?全部内容,希望文章能够帮你解决Python自定义比较器如何工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。