当前位置:   article > 正文

python 各种排序_用python画郁金香

用python画郁金香
先从例子说起:

  输入数据

  第一行有一个整数 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.源码:

  1. #郁金香
  2. zs = int(input());d=[];n1=[]
  3. for i in range(zs):
  4. size = input().split()
  5. a = []; n=0 ; c=[] #第一个输出,为花的种类计数#花儿输入组成的列表
  6. for ii in range(int(size[0])):
  7. a += list(input())#完美代替。append()
  8. for iii in range(65,97):
  9. b = chr(iii)#这朵花
  10. if b in a:
  11. n = n+1
  12. f = a.count(b)#这个花出现的频率
  13. ci = (-f,b)#最关键的地方
  14. c.append(ci)
  15. c11 = sorted(c,key=lambda c:c[0])#给字符串排序
  16. d = d + c11
  17. n1.append(n)
  18. m = -1
  19. for i0 in n1:
  20. m += 1
  21. print(i0)
  22. for i1 in range(i0):
  23. aaa = d.pop(0)
  24. print(abs(aaa[0]),aaa[1])

别人的思路又有哪些?我得到的启发?

  1. def test():
  2. line = int(input())
  3. for i in range(line):
  4. flowers = []
  5. row, col = [int(x) for x in input().split()]
  6. for j in range(row):
  7. flowers.append(input())
  8. flowers = "".join(flowers)
  9. d = {}
  10. for f in flowers:
  11. if f in d:
  12. d[f] += 1
  13. else:
  14. d[f] = 1
  15. d1 = sorted(d, key=lambda x: (-d[x], ord(x)))
  16. print(len(d1))
  17. for k in d1:
  18. print(d[k], k)
  19. if __name__ == '__main__':
  20. test()
最后的if语句,让函数自己也可以作为主程序。另外这位同学也用到排序的小技巧。

3.再讲讲排序

python里面的两个.sort()和sorted(),前者在现有的数据上做出改变,后者会新生成数据(b=sorted(a))。

  1. sorted([5, 2, 3, 1, 4])
  2. [1, 2, 3, 4, 5]
  3. 给列表排序
  4. sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
  5. [1, 2, 3, 4, 5]
  6. 给字典的键排序并提取出来的列表
  1. 单词的首字母排序
  2. sorted("This is a test string from Andrew".split(), key=str.lower)
  3. ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

  1. 列表的元组多成分中指定以某一单位排序:
  2. student_tuples = [
  3. ... ('john', 'A', 15),
  4. ... ('jane', 'B', 12),
  5. ... ('dave', 'B', 10),
  6. ... ]
  7. >>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
  8. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  9. #这里的student是随便设置的,列表的一个单元

操作数operater下使用sort

  1. from operator import itemgetter, attrgetter
  2. >>> sorted(student_tuples, key=itemgetter(2))#这里不涉及数字的排序,故当等级 相同时,原始的数字顺序保留。
  3. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  4. 优先级排序:
  5. sorted(student_tuples, key=itemgetter(1,2))
  6. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
  7. #先以等级A排序,当同时为B的时候,在以数字从小到大排序
  8. 选择正反排序
  9. sorted(student_tuples, key=itemgetter(2), reverse=True)#以数字倒序排
  10. [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
  11. 当有优先级的时候:
  12.  a=[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
  13. >>> b=sorted(a, key=itemgetter(1,2))
  14. >>> b
  15. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
  16. >>> b=sorted(a, key=itemgetter(1,2),reverse=True)
  17. >>> b
  18. [('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]
  19. 倒序排的话,就会都倒叙,无法控制一个倒叙,一个顺序
  20. 小技巧:我要说的是我们可以用循环遍历先改变数字项的正负,这样就可以了!有的时候数字项既有正数也有负数,我们可以用100-原有的数,排好了之后再用100-
  21. 排好了的数还原。字母也可以用ord(),chr()与数字互换。另外:单项反序也可以直接在函数里面指定元素的负数
result = sorted(a, key=lambda x: (-x[1], x[0]))
看例子:
>>> a=[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> b=sorted(a, key=lambda x :(x[1],x[2]))
>>> b
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> b=sorted(a, key=lambda x :(x[1],-x[2]))
>>> b
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号