我在 Python 3.3.x
中有一个 Counter
我想对其进行排序。
我知道我可以使用 .most_common(x)
但我希望键在值相同的情况下按字母顺序排序。
有什么办法可以做到这一点?设置这种“决胜局”?
最佳答案
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
对 most_common
给出的 (key, value)
数据进行排序。我们要确保项目必须按其 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
,3
会是-3
.它将最小的元素放在开头。因为我们得到了 3 的 -3
,所以 3 会在开头,2
会在它旁边,1 会在它之后。所以结果变成了[3, 2, 1]
。
我们应用相同的技术,根据元素中的两个项目进行排序。我们首先根据计数值降序排序,如果它们匹配则根据键升序排序。
关于python - 使用次要术语(决胜局)在 python 中排序计数器集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23033625/