python - 使用次要术语(决胜局)在 python 中排序计数器集合

标签 python sorting python-3.x counter

我在 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)]

我们让 sortedmost_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会是-13会是-3 .它将最小的元素放在开头。因为我们得到了 3 的 -3,所以 3 会在开头,2 会在它旁边,1 会在它之后。所以结果变成了[3, 2, 1]

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

关于python - 使用次要术语(决胜局)在 python 中排序计数器集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23033625/

相关文章:

python - TensorFlow 的 LSTMCell 究竟是如何运作的?

python-3.x - 从python中列表的元素中查找字符串中的字符

python-3.x - 类型错误 : ufunc 'isnan' not supported for the input types, - seaborn 热图

javascript - 将 JSON 对象转换为数组以在不丢失键/索引的情况下进行排序

python:按子列表中的项目对列表列表进行排序

python - 如何在 Windows 上运行介子构建系统?

Python 导入模块与导入_模块

python - python中的文件处理

python - 在 save() 重写中读取外键引用引发 RelatedObjectDoesNotExist

Javascript 排序方法