python:如何对列表/元组进行排序(list/tuple)
链接:https://www.codenong.com/3121979/
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
我想按子集中的第二个元素排序。也就是说,按2,5,8排序,其中2来自(1,2,3),5来自(4,5,6)。通常的方法是什么?我应该在列表中存储元组或列表吗?
sorted_by_second = sorted(data, key=lambda tup: tup[1])
或:
data.sort(key=lambda tup: tup[1]) # sorts in place
Python中list元组如何按照第二维元素排序
链接:https://www.jianshu.com/p/4b677a043226
在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是按照从左到右比较的,比较完第一个,如果相等,比较第二个。