赞
踩
输入数据
第一行有一个整数 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]))
看例子:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。