zoukankan      html  css  js  c++  java
  • 对字符串进行排序 以及 sort() 与sorted()

    sort()函数与sorted()函数的区别

      sort()是List对象的方法

      sorted()只要是可迭代对象就可以,使用范围比sort()函数更广

    List的sort()函数定义与用法:

    Python源码builtins.py文件对sort()函数的定义如下

        def sort(self, key=None, reverse=False):
            """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """
            pass

    可以看出:sort()函数没有返回值,有两个参数。key表示的是排依据的函数;reverse是指需不需要反转列表,默认为False表示的是升序,如果设为True表示的是降序。

    sort()用法如下

    L = [1, 2, 7, 4, 3]
    L.sort()
    print(L)
    #[1, 2, 3, 4, 7]
    
    我们加入一些参数来看看,如降序排序:
    L = [1, 2, 7, 4, 3]
    L.sort(reverse=True)
    print(L)
    #[7, 4, 3, 2, 1]
    
    通过key来实现降序排序,这里用到匿名函数lambda:
    
    L = [1, 2, 7, 4, 3]
    L.sort(key=lambda x : x*(-1))
    print(L)
    #[7, 4, 3, 2, 1]


    将key设为内置函数或者自定义函数,比如用绝对值函数:

    L = [-1, 2, -7, 4, 3]
    L.sort(key=abs)
    print(L)
    #[-1, 2, 3, 4, -7]

    Python3对key的还有另外一种支持,就是通过functools模块的cmp_to_key函数,将传统的cmp函数转为key。这和lambda函数用法类似,但是对于比较的逻辑比较复杂的情况,这样的方式会更清晰更便于维护。

    from functools import cmp_to_key
    L = [-1, 2, -7, 4, 3]
    def cmp(a,b):
        if abs(a) < abs(b):
            return -1
        else:
            return 1
    L.sort(key=cmp_to_key(cmp))
    print(L)

    二.sorted()

    官方文档

    sorted(iterable,*,key = None,reverse = False )
    从iterable中的项目返回一个新的排序列表。
    
    有两个可选参数,必须将其指定为关键字参数。
    
    key指定一个参数的功能,该参数用于从iterable中的每个元素中提取一个比较键(例如key=str.lower)。默认值为None(直接比较元素)。
    
    reverse是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。
    
    用functools.cmp_to_key()一个老式的转换CMP功能的 关键功能。
    
    内置sorted()功能保证稳定。如果可以保证不更改比较相等的元素的相对顺序,则排序是稳定的-这有助于多次通过排序(例如,按部门排序,然后按薪级排序)。

    sorted()返回值为List类型。参数列表iterable表示可迭代对象;*表示位置参数就此终结,后面的参数都必须用关键字来指定;key与reverse参数用法与sort()完全一致。

    对字典进行value值排序(默认是通过key值排序)

    Dict = {'a':2, 'b':3, 'c':7, 'd':4, 'e':1}
    L = sorted(Dict.items(), key=lambda x : x[1])
    print(L)
    #[('e', 1), ('a', 2), ('b', 3), ('d', 4), ('c', 7)]

    面试题:

    对一个字符串进行统计,并且按照字符的数量依次排序

    bbb='qqwwwwweredfdfhfgooooooooooo'
    #对bbb列表里的子字符进行排序
    L = sorted(bbb)
    
    ll=[]
    dic={}
    count=0
    for i in L:
        #每运行一次+1,统计运行次数
        count += 1
        #当ll列表内没有值时
        if len(ll)==0:
            ll.append(i)
        #当i不再ll列表内时统计列表长度,并加入字典,然后清空,再将i加入列表
        elif i not in ll:
            dic[ll[0]]=len(ll)
            ll.clear()
            ll.append(i)
        #当i再列表内时,并且count小于列表总长度
        elif count<len(L):
            ll.append(i)
        #当i为列表内最后一个值
        elif i == L[-1] and count==len(L):
            ll.append(i)
            dic[ll[0]] = len(ll)
    
    print(dic.items())
    bbb=sorted(dic.items(),key=lambda x:x[1])
    print(bbb)
  • 相关阅读:
    [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比
    JSON和数据集互相转换单元
    Windows管理多个java版本--解决'has value '1.8',but'1.7' is required'的方法
    Spring+SpringMVC+MyBatis+Maven框架整合
    让你的程序通过XP防火墙
    内存共享【Delphi版】
    自学k8s-安装docker特定版本技巧
    自学k8s-k8s集群环境搭建
    自学k8s-安装过程为下载flannel.yml和镜像文件,而需要设置的代理
    Centos开放指定端口命令
  • 原文地址:https://www.cnblogs.com/ltyc/p/14121568.html
Copyright © 2011-2022 走看看