使用次要术语(tie breaker)对python中的计数器集合进行排序

Sag*_*Low 10 python sorting counter python-3.x

我有一个Counter在Python 3.3.x我要排序.
我知道我可以使用,.most_common(x)但我希望在相同值的情况下按字母顺序排序键.
有没有办法可以做到这一点?设置这种"打破平局"?

the*_*eye 15

collections.Counter实际上是一个字典,它们依赖于散列技术,所以我们实际上无法按顺序访问它们.由于无法按顺序访问,因此排序字典是不可能的.但是您可以将其转换为与键和值对应的元组列表,然后对其进行排序.例如,

print(Counter('abracadabra').most_common())
# [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
print(sorted(Counter('abracadabra').most_common(), key=lambda x: (-x[1], x[0])))
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]
Run Code Online (Sandbox Code Playgroud)

我们sorted对(key, value)给出的数据进行排序most_common.我们希望确保项目必须按其降序排序,value并按升序排序key.所以,我们在这里使用一个小技巧.对于要排序的序列中的每个元素,sorted将调用我们传递的函数作为key参数的值.在与其他元素进行比较时,该函数返回的值将用于表示该特定元素.在我们的例子中,key函数是这样的

lambda x: (-x[1], x[0])
Run Code Online (Sandbox Code Playgroud)

在这里,x最终会获得所有元素,并且它会交换第一个和第二个元素的位置,并否定实际的计数部分.因为,sorted默认情况下,按升序对数据进行排序,我们将最大的数字设为最小,反之亦然.例如,

[2, 3, 1]
Run Code Online (Sandbox Code Playgroud)

如果要按升序对它们进行排序,sorted则将最小元素保留在开头,将最小元素保持在第二个位置,依此类推,直到达到最大元素.在我们的例子中,它变成了[1, 2, 3].要按降序对元素进行排序,我们将其否定值表示实际数字.

sorted([2, 3, 1], key=lambda x: -x)
Run Code Online (Sandbox Code Playgroud)

现在,当sorted选秀权2,它调用key得到要使用的价值函数,它将返回-2并以同样的方式,1会-1,3会-3.它将在开头放置最小的元素.因为我们得到-3了3,所以3将在开始时,2将在它旁边,1将在它之后.结果就变成了[3, 2, 1].

我们应用相同的技术,根据元素中的两个项进行排序.我们首先根据计数值进行降序排序,如果它们匹配基于键的排序,则升序.