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

bor*_*ror 4 python sorting string frequency

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

In [1]: frequency_sort("treeseeds")
Out [1]: "eeeesstrd"
Run Code Online (Sandbox Code Playgroud)

Stack Overflow 上的大多数解决方案都声明我应该使用该sorted()函数来获取结果,但是,它似乎只适用于某些情况。

我制作了两个应该可以工作的函数,但它们似乎都无法使用我的特定输入(见下文)。

第一个功能:

def frequency_sort(s):
    s_sorted = sorted(s, key=s.count, reverse=True)
    s_sorted = ''.join(c for c in s_sorted)
    return s_sorted
Run Code Online (Sandbox Code Playgroud)

第二个功能:

import collections
def frequency_sort_with_counter(s):
    counter = collections.Counter(s)
    s_sorted = sorted(s, key=counter.get, reverse=True)
    s_sorted = ''.join(c for c in s_sorted)
    return s_sorted
Run Code Online (Sandbox Code Playgroud)

使用这两个函数,我的输出如下所示:

第一个输出没问题:

In [1]: frequency_sort("loveleee")
Out [1]: "eeeellov"
Run Code Online (Sandbox Code Playgroud)

第二个输出没那么多

In [2]: frequency_sort("loveleel")
Out [2]: "leleelov"
Run Code Online (Sandbox Code Playgroud)

第三个输出完全混乱:

In [3]: frequency_sort("oloveleelo")
Out [3]: "oloeleelov"
Run Code Online (Sandbox Code Playgroud)

可能出了什么问题?它是否以某种方式连接到“o”和“l”字符?或者我只是错过了什么?

jak*_*vdp 5

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

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'
Run Code Online (Sandbox Code Playgroud)