python中带辅助项的排序计数器集合(平分符)
我在python中带辅助项的排序计数器集合(平分符),python,sorting,python-3.x,counter,Python,Sorting,Python 3.x,Counter,我在python3.3.x中有一个计数器,我想对它进行排序。 我知道我可以使用。最常用的(x),但我希望键按字母顺序排序,以防值相同。 我有办法做到这一点吗?设置这种“平局断路器”?实际上是一个字典,它们依赖于哈希技术,因此我们确实无法按顺序访问它们。因为按顺序访问是不可能的,所以对字典进行排序是不可能的。但您可以将其转换为对应于键和值的元组列表,然后对其进行排序。比如说, print(Counter('abracadabra').most_common()) # [('a', 5), ('r'
python3.3.x
中有一个计数器
,我想对它进行排序。我知道我可以使用
。最常用的(x)
,但我希望键按字母顺序排序,以防值相同。我有办法做到这一点吗?设置这种“平局断路器”?实际上是一个字典,它们依赖于哈希技术,因此我们确实无法按顺序访问它们。因为按顺序访问是不可能的,所以对字典进行排序是不可能的。但您可以将其转换为对应于键和值的元组列表,然后对其进行排序。比如说,
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)]
[2, 3, 1]
我们将排序
对最常见的给出的(键、值)
数据进行排序。我们希望确保项目必须按值降序排序,按键升序排序。所以,我们在这里使用一个小技巧sorted
将调用我们传递的函数作为要排序序列中每个元素的键
参数的值。该函数返回的值将用于在与其他元素进行比较时表示该特定元素。在我们的例子中,键
函数如下
lambda x: (-x[1], x[0])
这里,x
最终将获得所有元素,它交换第一个和第二个元素的位置,并对实际计数部分求反。由于默认情况下,排序的
按升序对数据进行排序,因此我们将最大的数字设为最小的,反之亦然。比如说,
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)]
[2, 3, 1]
如果要按升序对它们进行排序,排序后的将把最小的元素保留在开头,下一个最小的元素保留在第二个位置,依此类推,直到它到达最大的元素为止。在我们的例子中,它变成了[1,2,3]
。为了按降序对元素进行排序,我们让它们的反数值表示实际的数字
sorted([2, 3, 1], key=lambda x: -x)
现在,当排序选择2
时,它调用键
函数获取要使用的值,它将返回-2
,同样,1
将是-1
,3
将是-3
。它将在开始处放置具有最小值的元素。因为我们得到了3的-3
,3将在开头,2
将在它旁边,1将在它后面。因此结果变成[3,2,1]
我们应用相同的技术,根据元素中的两个项进行排序。我们首先通过降序根据计数值进行排序,如果它们与基于键的排序相匹配,则使用升序进行排序。在出现断开连接的情况下,使用sorted()和应用于“keys”参数的lambda函数,可以解决按多个选项(和不同顺序)进行排序的问题
result=sorted(result,key=lambda x: (-x[2],x[0],x[1]))
x[2]
的'-'
ve符号表示排序应首先按“result”第三个元素的降序进行x[0],x[1]
进一步指出,应按照x[0]
和x[1]
的升序,按该确切顺序断开连接。另请参阅您最好使用items()
而不是最常见的()
:排序(计数器('abracadabra').items(),key=lambda x:(.x[1],x[0])
。这两种方法之间唯一的区别是most_common()
以不同的顺序返回项目,但这没有什么区别,因为您必须对数据进行重新排序。在这里很难比较most_common
和items
。由于Python
使用timsort
,因此最常见的返回的偏序集合可能排序更快。此外,出于某种原因,sorted
在上的性能稍好一些(items返回的dict_items
实际上是一个生成器)。我怀疑将一个列表复制到另一个列表会在幕后调用memcpy
,而将生成器复制到一个列表则涉及python迭代的所有机制。虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-@NelsonGon请检查新编辑的质量。