• (转)python3中sort和sorted的区别详解


    版权声明:本文为CSDN博主「Vince Li」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_43250623/article/details/88829341

    sort和sorted的区别
    虽然python3中sort()和sorted()都可以用来排序,但二者有以下两个最主要的区别:

    sort只能应用在列表list上,而sorted可以对所有可迭代的对象进行排序的操作

    sort方法会在原list上直接进行排序,不会创建新的list。而sorted方法不会对原来的数据做任何改动,排序后的结果是新生成的。
    如果我们不需要原来的数据而且数据是list类型,可以用sort方法,能够节省空间。否则要用sorted方法。
    sort
    在python3中有key和reverse两个可选参数。参数reverse指定排序是升序还是降序,默认是升序参数key指定了只含一个参数的方法,这个方法用来从列表的每个元素中提取比较键。可以看看下面几个例子:

    1.通过元素长度排序

    s_list = ["bbb","ccc","bac","ab","ba"]
    s_list.sort(key=len) # key=len 指定排序规则按长度排序
    print(s_list)
    1
    2
    3
    打印结果如下:

    ['ab', 'ba', 'bbb', 'ccc', 'bac']
    1
    2.通过元素的字符顺序

    s_list = ["bbb","BBB","bAc","ab","bac"]
    s_list.sort() # 默认升序
    print(s_list)
    s_list.sort(key=str.lower)  # 先小写再大写
    print(s_list)
    1
    2
    3
    4
    5
    打印结果如下:

    ['BBB', 'ab', 'bAc', 'bac', 'bbb']
    ['ab', 'bAc', 'bac', 'BBB', 'bbb']
    1
    2
    3.更复杂一点的排序:list里的元素是一个字典,通过字典的某个属性值排序。
    下面是通过学生的年龄排序

    student = [{"name": "小C", "age": 12, "score": 90},
               {"name": "小D", "age": 13, "score": 84},
               {"name": "小A", "age": 14, "score": 85},
               {"name": "小E", "age": 15, "score": 89},
               {"name": "小F", "age": 12, "score": 88}]
    student.sort(key=lambda a: a["age"])
    # 此方法是对list的元素进行排序,每一个元素是一个字典,按字典中的age进行排序,但不能直接对字典进行排序,sort的操作对象只能是list
    print(student)
    1
    2
    3
    4
    5
    6
    7
    8
    打印结果如下:

    [{'name': '小C', 'age': 12, 'score': 90},
    {'name': '小F', 'age': 12, 'score': 88},
    {'name': '小D', 'age': 13, 'score': 84},
    {'name': '小A', 'age': 14, 'score': 85},
    {'name': '小E', 'age': 15, 'score': 89}]
    1
    2
    3
    4
    5
    由于sort只有list类型才可以用属于列表的成员方法,所以用的更普遍的是sorted方法,下面来说下sorted方法
    注意:sort只有list类型才可以用
    注意:sort只有list类型才可以用
    注意:sort只有list类型才可以用

    返回值
    sort方法会在原list上直接进行排序,不会创建新的list,所以sort没有返回值或者说返回None

    sorted
    所有可迭代对象都可以用sorted来进行排序,排序不会改变原来的对象。sorted接收3个参数:

    sorted一共有iterable, key, reverse这三个参数;
    sorted(iterable, , key=None, reverse=False)

    参数    作用
    iterable    可迭代对象 , 例如: dict.items()、dict.keys()等
    key    用来选取参与比较的元素, 例如确定是按照字典的键比较还是按照值进行比较
    reverse    用来指定排序是升序还是降序,reverse=true是降序,false时则是升序,默认时是升序
    看下面一个小例子:

    s_tuples = [('john', 'A', 15),
                      ('jane', 'B', 12),
                      ('dave', 'B', 10)]
    new_tuples = sorted(s_tuples , key=lambda student: student[2]) # student[2]表示按照列表中的元组中的第三个元素的大小进行排序
    print(s_tuples )
    print(new_tuples)
    1
    2
    3
    4
    5
    6
    打印结果如下:

    [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] # 原始的
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] # 排序过的
    1
    2
    新列表是通过年龄排序的,从打印结果可以看出没有改变原数据

    这种含有key参数的方法使用十分普遍

    2,对字典的值进行排序
    a = { "b": 5, "c": 2,"a": 4, "d": 1}
    #对字典按值(value)进行排序(默认由小到大)
    test_2=sorted(a.items(),key=lambda x:x[1])
    #输出结果
    print(test_2)
    1
    2
    3
    4
    5
    打印结果为:

     [('d', 1), ('c', 2), ('a', 4), ('b', 5)] # 对值进行了排序
    1
    返回值
    sorted方法不会对原来的数据做任何改动,排序后的结果是新生成的。所以sorted会返回一个排序过的列表
    ————————————————

  • 相关阅读:
    geoserver显示shapefile中汉字呈乱码问题的可选解决方案
    C++回调函数示例
    也谈谈技术面试
    轻快好的c++实践
    向 Hacker 迈进 我的书单
    CMake是个好东西
    工作之中总有几日不在状态_你是怎样度过的?
    我是如何从煤矿工成为程序员的
    java多线程系列_用Thread类创建线程(2)
    java多线程系列_使用Runnable接口创建线程(3)
  • 原文地址:https://www.cnblogs.com/hujc/p/11911310.html
Copyright © 2020-2023  润新知