编程语言
首页 > 编程语言> > Python自定义比较器如何工作?

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