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