python - 将排序的字符聚集在一起的更优雅的方式?
问题描述
假设,我想按频率对字符串中的字符进行排序。
def frequencySort(self, s: str) -> str:
freq = {}
for i in s:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
print(freq)
sorted_chars = sorted(s, key = lambda x : -freq[x])
return "".join(sorted_chars)
但是,对于某些字符具有相同频率的输入,这些字符最终会在输出中混合在一起。
例如,对于输入loveleetcode
输出上面的代码,eeeelolovtcd
它应该输出eeeeoollvtcd
或eeeelloovtcd
(o 和 l 应该聚集在一起,而不是混合)。
因此,我添加了一个使用字符 ASCII 代码的一小部分的决胜局(最终小于一个,因此保证不会压倒下一个最常见的字符):
def frequencySort(self, s: str) -> str:
freq = {}
for i in s:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
# Tie-breaker:
for i in freq:
freq[i] += ord(i) / 1000
sorted_chars = sorted(s, key = lambda x : -freq[x])
return "".join(sorted_chars)
这很好用,但我想知道是否有更优雅(pythonic)的方式来在排序过程中强制对相似字符进行聚类。
解决方案
将排序键更改为包含字符本身的元组。
def frequencySort(self, s: str) -> str:
freq = {}
for i in s:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
sorted_chars = sorted(s, key=lambda x: (-freq[x], x))
return "".join(sorted_chars)
现在,当sorted()
遇到两个具有相同计数的不同字符时,它将使用元组的下一个元素对它们进行排序。由于下一个元素是字符本身,因此相同的字符将彼此相邻排序。
>>> solution.frequencySort("loveleetcode")
'eeeelloocdtv'
无关说明:您可以使用collections.Counter
而不是创建字典并计算字符。
freq = collections.Counter(s)
代替
freq = {}
for i in s:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
推荐阅读
- firebase - Flutter:如何防止在通过电子邮件验证用户时才显示主页的情况下出现奇怪的导航?
- javascript - Javascript 真实条件未检测到布尔值
- flutter - 使用 FutureBuilder 和 Provider 在 Flutter 中出现错误状态没有元素
- javascript - 如果选择了一个下拉菜单,则修改视图,其他下拉菜单将被禁用
- c++ - C++ GetModuleFileName 使用 Boost
- javascript - 使用 Redux 的全局按钮单击
- acumatica - Acumatica 操作未在导入方案中执行
- f# - 带有 FSharpPlus 的 Reader monad 转换器示例
- json - PostgreSQL 中的 JSON 数据类型
- python - 图像分割:应用二值掩膜分离光伏面板表面及其表面的污垢