python sorted方法

介绍

sorted方法用来进行排序操作,如数字,字符串组成的list,根据dict类型的key或者value排序,现将平时使用的sorted的方法和数据类型进行整理。

sorted(iterable[, cmp[, key[, reverse]]])
    """
    对一个iterable对象排序,返回一个排序之后的list

    @param iterable 可迭代遍历对象
    @param cmp 默认None, 自定义的比较函数,2个参数
    @param key 默认None, 自定义的函数,1个参数,参数值来源与列表元素
    @param reverse 默认False(正序)
    @return 返回一个排序之后的list
    """
    pass

数据类型

首先自定义object用于后续的比较。定义User,包含name和age两个成员变量

class User(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return repr((self.name, self.age))

list

以list类型的对象作为待排序数据,其中元素为数字,字符串,元组,object分别给出测试样例。

  • 简单类型样例
# -*- coding=utf-8 -*-
from operator import itemgetter, attrgetter

def sort_list():
    """
    关于list类型的排序操作

    """
    # 数值类型
    test_list = [1, 2, 19, 30]
    print sorted(test_list)
    print sorted(test_list, reverse=True)

    # 字符串类型
    test_list = ["a", "boy", "named", "marvin"]
    print sorted(test_list)
    print sorted(test_list, reverse=True)

    # tuple类型
    test_list = [("Up", 0), ("Down", 1), ("Left", 2), ("Right", 3)]
    # tuple的index=0处值比较,即"Up","Down"等比较
    print sorted(test_list, key=lambda item: item[0])
    # tuple的index=1处值比较,即0,1等比较
    print sorted(test_list, key=lambda item: item[1])
    # tuple的index=1处值比较,itemgetter获取元素1号位置
    print sorted(test_list, key=itemgetter(1))
  • object类型示例
def sort_list_obj():
    """
    object组成的list排序

    """
    # 根据User的属性name的值排序
    # attrgetter获取元素的属性值
    test_list = [User("James", 30), User("Marvin", 28), User("Parke", 40), User("Li", 40)]
    print sorted(test_list, key=lambda user: user.name)
    print sorted(test_list, key=attrgetter("name"))

    # 根据User的属性age的值排序
    print sorted(test_list, key=lambda user: user.age)
    print sorted(test_list, key=attrgetter("age"))

    # 先根据age排序,再根据name排序
    print sorted(test_list, key=attrgetter("age", "name"))

if __name__ == "__main__":
    print "list sort test.\n--------------------"
    sort_list()

    print "list of object test.\n--------------------"
    sort_list_obj()
  • 输出结果
list sort test.
--------------------
[1, 2, 19, 30]
[30, 19, 2, 1]
['a', 'boy', 'marvin', 'named']
['named', 'marvin', 'boy', 'a']
[('Down', 1), ('Left', 2), ('Right', 3), ('Up', 0)]
[('Up', 0), ('Down', 1), ('Left', 2), ('Right', 3)]
[('Up', 0), ('Down', 1), ('Left', 2), ('Right', 3)]

list of object test.
--------------------
[('James', 30), ('Li', 40), ('Marvin', 28), ('Parke', 40)]
[('James', 30), ('Li', 40), ('Marvin', 28), ('Parke', 40)]
[('Marvin', 28), ('James', 30), ('Parke', 40), ('Li', 40)]
[('Marvin', 28), ('James', 30), ('Parke', 40), ('Li', 40)]
[('Marvin', 28), ('James', 30), ('Li', 40), ('Parke', 40)]

dict

以dict类型的对象作为待排序数据,其中元素为数字,字符串,元组,对象分别给出测试样例。

  • 简单对象示例
def sort_map():
    """
    map类型的排序操作

    """
    # 数值类型
    test_map = {1: "a", 2: "boy", 3: "named", 4: "marvin"}
    print sorted(test_map)
    print sorted(test_map.values())

    # 根据value排序
    print sorted(test_map.items(), key=lambda item: item[1])

    # 根据key排序
    print sorted(test_map.items(), key=lambda item: item[0], reverse=True)

    # tuple类型
    test_map = {1: ("Up", 0), 2: ("Down", 1), 3: ("Left", 2), 4: ("Right", 3)}
    print sorted(test_map.items(), key=lambda item: item[1][0])
  • object对象示例
def sort_dict_obj():
    """
    object组成的dict的value排序

    """
    test_map = {1: User("James", 30), 2: User("Marvin", 28), 3: User("Parke", 40), 4: User("Li", 79)}

    # 根据value的age排序
    print sorted(test_map.items(), key=lambda item: item[1].age)
    # 根据value的name排序
    print sorted(test_map.items(), key=lambda item: item[1].name)

    # 根据key排序
    print sorted(test_map.items(), key=lambda item: item[0])
    print sorted(test_map.items(), key=itemgetter(0))

    # 根据value的age对values排序
    print sorted(test_map.values(), key=lambda item: attrgetter("age"))


if __name__ == "__main__":
    print "map sort test\n--------------------"
    sort_map()

    print "dict of object test. \n--------------------"
    sort_dict_obj()
  • 输出结果
map sort test
--------------------
[1, 2, 3, 4]
['a', 'boy', 'marvin', 'named']
[(1, 'a'), (2, 'boy'), (4, 'marvin'), (3, 'named')]
[(4, 'marvin'), (3, 'named'), (2, 'boy'), (1, 'a')]
[(2, ('Down', 1)), (3, ('Left', 2)), (4, ('Right', 3)), (1, ('Up', 0))]


dict of object test. 
--------------------
[(2, ('Marvin', 28)), (1, ('James', 30)), (3, ('Parke', 40)), (4, ('Li', 79))]
[(1, ('James', 30)), (4, ('Li', 79)), (2, ('Marvin', 28)), (3, ('Parke', 40))]
[(1, ('James', 30)), (2, ('Marvin', 28)), (3, ('Parke', 40)), (4, ('Li', 79))]
[(1, ('James', 30)), (2, ('Marvin', 28)), (3, ('Parke', 40)), (4, ('Li', 79))]
[('James', 30), ('Marvin', 28), ('Parke', 40), ('Li', 79)]

参考文献

python-2.7.14-docs -> Built-in Functions -> sorted()

  • 27
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值