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

时间:2014-04-12 17:15:31

标签: python sorting python-3.x counter

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

2 个答案:

答案 0 :(得分: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)]

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

lambda x: (-x[1], x[0])

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

[2, 3, 1]

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

sorted([2, 3, 1], key=lambda x: -x)

现在,当sorted选择2时,它会调用key函数来获取要使用的值,它将以同样的方式返回-2,{{ 1}}将1-1将为3。它将在开头放置最小的元素。由于我们得到-3为3,因此3将位于开头,-3将位于其旁边,1将位于其后面。结果变为2

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

答案 1 :(得分:1)

可以使用sorted()和将lambda函数应用于'keys'参数来解决在抢七的情况下通过多个选项(和不同顺序)进行排序的问题。

result=sorted(result,key=lambda x: (-x[2],x[0],x[1]))

'-'的{​​{1}} ve符号表示排序应首先按照“结果”的第三个元素的降序顺序进行。 x[2]进一步指示应按x[0], x[1]x[0] 升序顺序(该确切顺序)断开联系。另请参阅1