我有一个问题,按频率排序一个简单的字符串(我得到一个字符串作为输入,我需要将一个排序的字符串作为输出按降序返回).
让我举个例子(原始单词包含4个e,2个s,1个t,1个r和1个d;所以这些被排序):
In [1]: frequency_sort("treeseeds")
Out [1]: "eeeesstrd"
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
第二功能:
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
使用这两个函数,我的输出如下所示:
第一个输出没问题:
In [1]: frequency_sort("loveleee")
Out [1]: "eeeellov"
第二个输出不是那么多
In [2]: frequency_sort("loveleel")
Out [2]: "leleelov"
第三个输出完全凌乱:
In [3]: frequency_sort("oloveleelo")
Out [3]: "oloeleelov"
什么可能出错?是否以某种方式连接到’o’和’l’字符?或者我只是错过了什么?
解决方法:
在多个字符具有相同频率的字符串中,您提出的算法无法区分出现次数相同的字符.你可以通过使用频率和字符本身的元组进行排序来解决这个问题.例如
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'
标签:python,sorting,frequency,string
来源: https://codeday.me/bug/20190622/1264972.html