Python按频率排序字符串-无法使用sorted()函数进行排序

Python按频率排序字符串-无法使用sorted()函数进行排序,python,string,sorting,frequency,Python,String,Sorting,Frequency,我对按频率对简单字符串进行排序有一个问题(我得到一个字符串作为输入,需要按降序返回一个已排序的字符串作为输出)。 让我给你举一个例子(原始单词包含4个e、2个s、1个t、1个r和1个d;因此这些单词被排序): [1]中的:频率排序(“树状”) Out[1]:“eeeesstrd” 大多数关于堆栈溢出的解决方案都规定我应该使用sorted()函数来获得结果,但是,它似乎只适用于某些情况 我做了两个应该可以工作的函数,但它们似乎都不能用我的特定输入实现(见下文) 第一个功能: def频率\u排序:

我对按频率对简单字符串进行排序有一个问题(我得到一个字符串作为输入,需要按降序返回一个已排序的字符串作为输出)。 让我给你举一个例子(原始单词包含4个e、2个s、1个t、1个r和1个d;因此这些单词被排序):

[1]中的
:频率排序(“树状”)
Out[1]:“eeeesstrd”
大多数关于堆栈溢出的解决方案都规定我应该使用
sorted()
函数来获得结果,但是,它似乎只适用于某些情况

我做了两个应该可以工作的函数,但它们似乎都不能用我的特定输入实现(见下文)

第一个功能:

def频率\u排序:
s_sorted=sorted(s,key=s.count,reverse=True)
s_排序=“”.join(c代表s_排序中的c)
返回s_排序
第二个功能:

导入集合
def频率\u排序\u和\u计数器:
计数器=集合。计数器
s_sorted=sorted(s,key=counter.get,reverse=True)
s_排序=“”.join(c代表s_排序中的c)
返回s_排序
对于这两种功能,我的输出如下所示:

第一个输出正常:

[1]中的
:频率排序(“Lovelee”)
Out[1]:“eeellov”
第二个输出不是那么多

[2]中的
:频率排序(“loveleel”)
Out[2]:“leleelov”
第三个输出非常混乱:

[3]中的
:频率排序(“oloveleelo”)
Out[3]:“Ololelov”

可能出了什么问题?它是否与“o”和“l”字符有某种联系?还是我遗漏了什么?

在多个字符具有相同频率的字符串中,您提出的算法无法区分出现相同次数的字符。您可以通过使用频率和字符本身的元组进行排序来解决这个问题;e、 g

In [7]: def frequency_sort(s):
        s_sorted = sorted(s, key=lambda c: (s.count(c), c), reverse=True)
        s_sorted = ''.join(c for c in s_sorted)
        return s_sorted
   ...: 

In [8]: frequency_sort("loveleel")
Out[8]: 'llleeevo'

在第三种情况下,3个字母具有相同的计数,这就是它们组合在一起的原因,您可以先对其进行排序(按字母表),然后按频率排序,将字母排列如下:

s_sorted = ''.join(sorted(sorted(s), key=lambda x: s.count(x), reverse=True))
输出:

eeellloooav
ooollleeeva
或者您可以将其反转:

s_sorted = ''.join(sorted(sorted(s, reverse=True), key=lambda x: s.count(x), reverse=True))
输出:

eeellloooav
ooollleeeva

问题是
sort
sorted
是稳定的排序。因此,如果两个值“相等”(在本例中为
key(item1)==key(item2)
),它们将以与
排序之前相同的顺序出现

例如,在上一个案例中,您有:

>>> from collections import Counter

>>> Counter("oloveleelo")
Counter({'e': 3, 'l': 3, 'o': 3, 'v': 1})
因此
'e'
'l'
'o'
具有相同的
键,因此它们将像最初一样出现:
“oloelelo”
,然后出现唯一具有不同计数的字符:
'v'

如果您不关心计数相等的元素的顺序(只是它们按字符分组),您甚至不需要排序,只需展平以下结果:


我想你忘了添加第三个函数。可能是