假設,我想按頻率對字串中的字符進行排序。
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 代碼的一小部分的決勝局(最終小于 1,因此保證不會壓倒下一個最常見的字符):
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)方法來在排序期間強制執行相似字符的聚類。
uj5u.com熱心網友回復:
將排序鍵更改為包含字符本身的元組。
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
uj5u.com熱心網友回復:
您可以使用 acollections.Counter及其most_common方法回傳按計數排序的 (char, count) 元組:
from collections import Counter
def frequencySort(s: str) -> str:
counts = Counter(s)
return ''.join([char * count for char, count in counts.most_common()])
print(frequencySort("loveleetcode"))
# 'eeeelloovtcd'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333887.html
