美文网首页
Python中list元组如何按照第二维元素排序

Python中list元组如何按照第二维元素排序

作者: 溪奇 | 来源:发表于2018-02-17 22:55 被阅读0次

    在Python中可以使用sorted函数对list进行排序,但是如果排序的对象是一个包含tuple的list时,sorted函数会使用tuple的第一个元素。如果想要使用tuple的第二个元素进行排序,可以向sorted函数传入一个key参数,key参数必须是一个函数,输入是list的一个元素,输出最好是一个数字或简单的字符。
    构造这样一个函数可以使用匿名函数lambda,示例代码如下:
    listA = [('a', 1), ('c', 3), ('d', 4), ('b', 2)]
    sorted(listA, key=lambda x:x[1])
    输出结果为:
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

    对List进行排序,Python提供了两个方法
    方法1.用List的内建函数list.sort进行排序
    list.sort(func=None, key=None, reverse=False)
    Python实例:

    list = [2,5,8,9,3]
    list
    [2,5,8,9,3]
    list.sort()
    list
    [2, 3, 5, 8, 9]
    方法2.用序列类型函数sorted(list)进行排序
    Python实例:
    list = [2,5,8,9,3]
    list
    [2,5,8,9,3]
    sorted(list)
    [2, 3, 5, 8, 9]
    两种方法的区别:
    sorted(list)返回一个对象,可以用作表达式。原来的list不变,生成一个新的排好序的list对象。
    list.sort() 不会返回对象,改变原有的list。
    其他sort的实例:
    实例1:正向排序
    L = [2,3,1,4]
    L.sort()
    L
    [1,2,3,4]
    实例2:反向排序
    L = [2,3,1,4]
    L.sort(reverse=True)
    L
    [4,3,2,1]
    实例3:对第二个关键字排序
    L = [('b',6),('a',1),('c',3),('d',4)]
    L.sort(lambda x,y:cmp(x[1],y[1]))
    L
    [('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例4: 对第二个关键字排序
    L = [('b',6),('a',1),('c',3),('d',4)]
    L.sort(key=lambda x:x[1])
    L
    [('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例5: 对第二个关键字排序
    L = [('b',2),('a',1),('c',3),('d',4)]
    import operator
    L.sort(key=operator.itemgetter(1))
    L
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    实例6:(DSU方法:Decorate-Sort-Undercorate)
    L = [('b',2),('a',1),('c',3),('d',4)]
    A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
    A.sort()
    L = [s[2] for s in A]
    L
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    以上给出了6种对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项
    为比较关键字进行排序.
    效率比较:
    cmp < DSU < key
    通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
    多关键字比较排序:
    实例7:
    L = [('d',2),('a',4),('b',3),('c',2)]
    L.sort(key=lambda x:x[1])
    L
    [('d', 2), ('c', 2), ('b', 3), ('a', 4)]
    list.sort()
    >>> list
    [2, 3, 5, 8, 9]
    方法2.用序列类型函数sorted(list)进行排序
    Python实例:
    >>> list = [2,5,8,9,3]
    >>> list
    [2,5,8,9,3]
    >>> sorted(list)
    [2, 3, 5, 8, 9]
    两种方法的区别:
    sorted(list)返回一个对象,可以用作表达式。原来的list不变,生成一个新的排好序的list对象。
    list.sort() 不会返回对象,改变原有的list。
    其他sort的实例:
    实例1:正向排序
    >>>L = [2,3,1,4]
    >>>L.sort()
    >>>L
    >>>[1,2,3,4]
    实例2:反向排序
    >>>L = [2,3,1,4]
    >>>L.sort(reverse=True)
    >>>L
    >>>[4,3,2,1]
    实例3:对第二个关键字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(lambda x,y:cmp(x[1],y[1]))
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例4: 对第二个关键字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(key=lambda x:x[1])
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例5: 对第二个关键字排序
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>import operator
    >>>L.sort(key=operator.itemgetter(1))
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    实例6:(DSU方法:Decorate-Sort-Undercorate)
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
    >>>A.sort()
    >>>L = [s[2] for s in A]
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    以上给出了6种对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项
    为比较关键字进行排序.
    效率比较:
    cmp < DSU < key
    通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
    多关键字比较排序:
    实例7:
    >>>L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=lambda x:x[1])
    >>> L
    >>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]
    我们看到,此时排序过的L是仅仅按照第二个关键字来排的,
    如果我们想用第二个关键字排过序后再用第一个关键字进行排序呢?有两种方法
    实例8:
    L = [('d',2),('a',4),('b',3),('c',2)]
    L.sort(key=lambda x:(x[1],x[0]))
    L
    [('c', 2), ('d', 2), ('b', 3), ('a', 4)]
    实例9:
    L = [('d',2),('a',4),('b',3),('c',2)]
    L.sort(key=operator.itemgetter(1,0))
    L
    [('c', 2), ('d', 2), ('b', 3), ('a', 4)]
    L = [2,3,1,4]
    >>>L.sort(reverse=True)
    >>>L
    >>>[4,3,2,1]
    实例3:对第二个关键字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(lambda x,y:cmp(x[1],y[1]))
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例4: 对第二个关键字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(key=lambda x:x[1])
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
    实例5: 对第二个关键字排序
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>import operator
    >>>L.sort(key=operator.itemgetter(1))
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    实例6:(DSU方法:Decorate-Sort-Undercorate)
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
    >>>A.sort()
    >>>L = [s[2] for s in A]
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    以上给出了6种对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项
    为比较关键字进行排序.
    效率比较:
    cmp < DSU < key
    通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
    多关键字比较排序:
    实例7:
    >>>L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=lambda x:x[1])
    >>> L
    >>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]
    我们看到,此时排序过的L是仅仅按照第二个关键字来排的,
    如果我们想用第二个关键字排过序后再用第一个关键字进行排序呢?有两种方法
    实例8:
    >>> L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=lambda x:(x[1],x[0]))
    >>> L
    >>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
    实例9:
    >>> L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=operator.itemgetter(1,0))
    >>> L
    >>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
    为什么实例8能够工作呢?原因在于tuple是按照从左到右比较的,比较完第一个,如果相等,比较第二个。
    链接:http://blog.chinaunix.net/uid-20775448-id-4222915.html

    相关文章

      网友评论

          本文标题:Python中list元组如何按照第二维元素排序

          本文链接:https://www.haomeiwen.com/subject/pfvrfxtx.html