输入数据
第一行有一个整数 t (1 ≤ t ≤ 100) ,表示有 t 组数据。
对于每组数据:
第一行有两个整数 n, m (1 ≤ n, m ≤ 100) ,表示花坛的长和宽;
接下来 n 行,每行有一个长度为 m 且由大写字母组成的的字符串,表示对应位置出现的花的种类。其中,相同的字母表示相同的花,不同的字母表示不同的花。
输出数据
对于每组数据:
第一行输出一个整数 k ,表示花坛中一共有 k 种不同的花。
接下来 k 行,每行输出一个整数 x 和一个字符 c ,表示出现了 x 个种类为 c 的花。
你需要按花出现的次数从大到小的顺序输出,如果多种花数量相同,请按花的种类从小到大输出。
样例输入
1
3 3
ABC
BBC
CCC
样例输出
3
5 C
3 B
21 1 A
1.讲思路
2.源码与他人的思路
3.好好讲讲Python里面的排序
1.这个题目的难点不在别的地方,就是排序这块。它输入的是个字母表格,我只要从字母a--z一个个去判断,是否在这个给定的字母表里面。判断好了就.count('a')计算a字母在字母表的出现频率。这样我就会得到(频率,字母)的组信息。这样下来,可能会有很多这样的,我们先要以频率大小有限排序,再要以字母大小排序。
2.源码:
#郁金香
zs = int(input());d=[];n1=[]
for i in range(zs):
size = input().split()
a = []; n=0 ; c=[] #第一个输出,为花的种类计数#花儿输入组成的列表
for ii in range(int(size[0])):
a += list(input())#完美代替。append()
for iii in range(65,97):
b = chr(iii)#这朵花
if b in a:
n = n+1
f = a.count(b)#这个花出现的频率
ci = (-f,b)#最关键的地方
c.append(ci)
c11 = sorted(c,key=lambda c:c[0])#给字符串排序
d = d + c11
n1.append(n)
m = -1
for i0 in n1:
m += 1
print(i0)
for i1 in range(i0):
aaa = d.pop(0)
print(abs(aaa[0]),aaa[1])
别人的思路又有哪些?我得到的启发?
def test():
line = int(input())
for i in range(line):
flowers = []
row, col = [int(x) for x in input().split()]
for j in range(row):
flowers.append(input())
flowers = "".join(flowers)
d = {}
for f in flowers:
if f in d:
d[f] += 1
else:
d[f] = 1
d1 = sorted(d, key=lambda x: (-d[x], ord(x)))
print(len(d1))
for k in d1:
print(d[k], k)
if __name__ == '__main__':
test()
最后的if语句,让函数自己也可以作为主程序。另外这位同学也用到排序的小技巧。
3.再讲讲排序
python里面的两个.sort()和sorted(),前者在现有的数据上做出改变,后者会新生成数据(b=sorted(a))。
sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
给列表排序
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]
给字典的键排序并提取出来的列表
单词的首字母排序
sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
列表的元组多成分中指定以某一单位排序:
student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
#这里的student是随便设置的,列表的一个单元
操作数operater下使用sort
from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))#这里不涉及数字的排序,故当等级 相同时,原始的数字顺序保留。
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
优先级排序:
sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
#先以等级A排序,当同时为B的时候,在以数字从小到大排序
选择正反排序
sorted(student_tuples, key=itemgetter(2), reverse=True)#以数字倒序排
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
当有优先级的时候:
a=[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> b=sorted(a, key=itemgetter(1,2))
>>> b
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> b=sorted(a, key=itemgetter(1,2),reverse=True)
>>> b
[('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]
倒序排的话,就会都倒叙,无法控制一个倒叙,一个顺序
小技巧:我要说的是我们可以用循环遍历先改变数字项的正负,这样就可以了!有的时候数字项既有正数也有负数,我们可以用100-原有的数,排好了之后再用100-
排好了的数还原。字母也可以用ord(),chr()与数字互换。另外:单项反序也可以直接在函数里面指定元素的负数
result = sorted(a, key=lambda x: (-x[1], x[0]))
看例子: