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)]



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 内置的排序函数可以轻松实现各种排序。下面的代码演示了如何使用sorted()函数进行排序:# 使用sorted()函数进行排序 list1 = [3, 2, 6, 5, 4] # 排序 list2 = sorted(list1) # 输出排序后的数组 print(list2) ### 回答2: Python 中有许多种排序算法,下面我将给出几种常见的排序算法的实现代码,并为每个算法提供注释。 1. 冒泡排序(Bubble Sort): ```python def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 注释:冒泡排序通过比较相邻的两个元素大小,将较大的元素向右冒泡,每一轮循环都能将最大的元素移动到末尾。 2. 插入排序(Insertion Sort): ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j+1] = arr[j] j -= 1 arr[j+1] = key return arr ``` 注释:插入排序将未排序部分的元素逐一插入到已排序部分的正确位置,每次插入都保证插入点左边的元素有序。 3. 快速排序(Quick Sort): ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 注释:快速排序通过将数组分成左右两个部分,以一个基准值(pivot)为界限,小于基准值的放在左边,大于基准值的放在右边,然后递归地对左右两部分进行排序。 以上是三种常见的排序算法的Python实现及其注释,在实际应用中可以根据需要选择合适的排序算法。 ### 回答3: 下面是几种常见的排序算法及其对应的Python代码和注释。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻的两个元素,如果顺序错误就交换它们,直到整个序列有序。 ```python def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 2. 插入排序(Insertion Sort) 插入排序是一种简单且稳定的排序算法,它将一个元素插入到已排序的序列中的正确位置。 ```python def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j+1] = arr[j] j -= 1 arr[j+1] = key return arr ``` 3. 快速排序(Quick Sort) 快速排序是一种高效的排序算法,它采用分治的思想,通过递归地将待排序序列分为较小的子序列来进行排序。 ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] less, equal, greater = [], [], [] for num in arr: if num < pivot: less.append(num) elif num == pivot: equal.append(num) else: greater.append(num) return quick_sort(less) + equal + quick_sort(greater) ``` 以上是三种常见的排序算法及其对应的Python代码和注释。这些算法都可以根据输入的列表进行排序,并返回排好序的列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值