Python自定义比较器如何工作?
作者:互联网
我有以下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-2-x 来源: https://codeday.me/bug/20191009/1877734.html