问题描述:
给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
输入描述
输入一行,为一个仅包含字母的字符串。
输出描述
按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。
xyxyXX
x:2;y:2;X:2;
说明:每个字符出现的个数都是2,故x排在y之前,而小写字母x排在X之前。
abababb
b:4;a:3;
说明:b的出现个数比a多,故b排在a之前。
解题思路:
根据规则:
- 统计各个字母出现次数:count()函数
- 按出现次数从大到小排序:sort()函数
- 次数相同则自然顺序且小写在大写之前:ord()函数,先小写后大写
需要注意的是,sort()函数会按照先大写后小写来排,这里简单将大小写分开计算
代码实现:
s = input()
se1 = set()#小写
se2 = set()#大写
for i in s:if 'a' <= i <= 'z':se1.add(i)elif 'A' <= i <= 'Z':se2.add(i)
#排序,先按照出现次数降序、再按照自然顺序
se1 = sorted(list(se1),key = lambda x : (-s.count(x),ord(x)))
se2 = sorted(list(se2),key = lambda x : (-s.count(x),ord(x)))
for i in se1:#按格式输出cnt = s.count(i)print(i,':',cnt,';',end = '',sep = '')
for i in se2:cnt = s.count(i)print(i,':',cnt,';',end = '',sep = '')