zoukankan      html  css  js  c++  java
  • (转)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会返回一个排序过的列表
    ————————————————

  • 相关阅读:
    PHP调用WCF提供的方法
    关于git报 warning: LF will be replaced by CRLF in README.md.的警告的解决办法
    vue中引入mui报Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them的错误
    微信小程序报Cannot read property 'setData' of undefined的错误
    Vue那些事儿之用visual stuido code编写vue报的错误Elements in iteration expect to have 'v-bind:key' directives.
    关于xampp中无法启动mysql,Attempting to start MySQL service...的解决办法!!
    PHP的环境搭建
    新手PHP连接MySQL数据库出问题(Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES))
    手机号码、获得当前时间,下拉框,填写限制
    团队作业(五):冲刺总结
  • 原文地址:https://www.cnblogs.com/hujc/p/11911310.html
Copyright © 2011-2022 走看看