Python用lambda作为sort的key按频率排序:数字与字符列表排序差异问题
问题原因
你当前的排序key仅指定了字符出现频率,而输入字符串里a和s的出现次数完全一致(均为3次)。Python内置的sort()是稳定排序:当两个元素的排序key相等时,会保留它们在原列表中的相对位置。
你输入的原始字符串为asdfasdfasdddffffff,转换为列表后a和s本身就是交替出现的,排序时因为二者的key(频率)相同,就会维持原有的交替顺序,所以输出里a和s是交错排列的。
之前的数字例子没有出现这个问题,是因为同频率的数字在原列表里本身就是连续排列的,所以排序后依然保持连续。
解决方案
修改sort的key为元组,在频率之后新增第二个排序规则:按字符本身排序,这样相同字符的排序key完全一致,就会自动聚合到一起:
def char_sort_by_freq(string_to_be_list): list_of_chars = list(string_to_be_list) char_count = {} for char in list_of_chars: char_count[char] = char_count.get(char, 0) + 1 # 排序key先按频率,再按字符本身,同频率的同字符就会排在一起 list_of_chars.sort(key = lambda x:(char_count[x], x)) return "".join(list_of_chars) print(char_sort_by_freq("asdfasdfasdddffffff"))
运行后就能得到你预期的aaasssdddddffffffff输出。如果希望同频率下按字符降序排列,把第二个排序项改成-ord(x)即可。
内容的提问来源于stack exchange,提问作者chrismint
相关产品推荐
相关产品推荐

