Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中带辅助项的排序计数器集合(平分符)_Python_Sorting_Python 3.x_Counter - Fatal编程技术网

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请检查新编辑的质量。