python 上各类数据的排序问题

本文通过比较对 Python 的 list、dict、tuple 应用 sort、sorted 函数的效果,并展示多关键字排序的使用

Python 内建排序函数

  • list.sort () 对 list 成员进行排序,不返回副本
  • sorted (list) 对 list 成员进行排序,返回副本

Python 排序列表 (list)?

  • 按元素大小排序:如果 list 内的元素是字符 / 字符串,将依次按照该字符 / 字符串的 ASCCII 值进行排序,即默认优先将大写字母排前面,可通过参数_key=str. lower_控制其从小字母优先排
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	# 数值类型
    >>> sorted([1,6,3,2,5,7,4])
    [1, 2, 3, 4, 5, 6, 7]
    #字符类型
    >>> sorted(['a','d','e','b','f','c'])
    ['a', 'b', 'c', 'd', 'e', 'f']
    # 字符串类型
    >>> sorted(['a','ad','ada','ad1','abe','b','f','c'])
    ['a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
    #字符串中包含大小写
    >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'])
    ['A', 'Abe', 'a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
    #小写字母优先
    >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=str.lower)
    ['a', 'A', 'abe', 'Abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
  • 按照元素属性排序
    1
    2
    3
    # 按列表元素的长度进行排序
    sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=lambda str:len(str))
    ['a', 'A', 'b', 'f', 'c', 'ad', 'ada', 'ad1', 'abe', 'Abe']

Python 排序字典 (dictory)?

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	 #对字典进行排序
    >>> sorted({1: 'D', 5: 'B', 2: 'B', 4: 'E', 3: 'A'})
    [1, 2, 3, 4, 5]
    #按照字典中的values的大小进行排序
    >>> dict
    {1: 'DE', 2: 'DDDB', 3: 'A', 4: 'QPOIE', 5: 'WWB'}
    >>> dict.items()
    dict_items([(1, 'DE'), (2, 'DDDB'), (3, 'A'), (4, 'QPOIE'), (5, 'WWB')])
    >>> sorted(dict.items(),key=lambda value:value[1])
    [(3, 'A'), (2, 'DDDB'), (1, 'DE'), (4, 'QPOIE'), (5, 'WWB')]
    #按照字典中的values的长度进行排序
    >>> sorted(dict.items(),key=lambda value:len(value[1]))
    [(3, 'A'), (1, 'DE'), (5, 'WWB'), (2, 'DDDB'), (4, 'QPOIE')]

Python 排序元组 (tuple)?

  • 单元组
    1
    2
    3
    4
    5
    6
    >>> tup1=(1,5,3,4,2,7,6)
    >>> sorted(tup1)
    [1, 2, 3, 4, 5, 6, 7]
    >>> tup2=('a','d','f','b','e','c')
    >>> sorted(tup2)
    ['a', 'b', 'c', 'd', 'e', 'f']
  • 元组列表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> tuplist=[('a',1),('c',4),('e',0),('d',2),('f',3)]
    >>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
    >>>
    #直接对元组列表进行排序
    >>> sorted(tuplist)
    [('a', 1), ('c', 4), ('d', 2), ('e', 0), ('f', 3)]
    #按照元组的第某个值进行排序
    >>> sorted(tuplist,key=lambda tup:tup[1])
    [('e', 0), ('a', 1), ('d', 2), ('f', 3), ('c', 4)]
    #按照元组的第某个值进行排序
    >>> sorted(student_tuples, key=lambda student: student[2])
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Python 高级排序?

  • 使用 Operator 模块
    1
    2
    3
    4
    5
    6
    7
    >>> 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)]