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.源码:

#郁金香
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]))
看例子:
>>> 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)]



你可能感兴趣的:(Python必备基础知识点,算法(小轮子))