I have the following Python dict:
[(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])]
现在我无法理解比较器是如何工作的,哪两个值正在被传递以及会发生多少次这样的比较?它是否在内部创建了一个排序后的键列表,以跟踪每个比较所做的情况?此外,行为似乎非常随机。 我很困惑,希望能得到帮助。
sort()
,但Python 3不支持。主要原因是使用自定义键函数要比使用自定义比较函数更高效,因为键函数只需要针对每个列表项调用一次,而比较函数必须为进行的每次比较调用一次。有关详细信息,请参见RussellLuo回答中的链接。 - PM 2Ring