经实践发现,当Python的默认列表排序器收到一个由元组组成的列表时,它会按照每个元组中第一个元素的大小进行排序。这个说法正确吗?如果不是,那么按照元组的第一个元素对列表进行排序的正确方法是什么?
经实践发现,当Python的默认列表排序器收到一个由元组组成的列表时,它会按照每个元组中第一个元素的大小进行排序。这个说法正确吗?如果不是,那么按照元组的第一个元素对列表进行排序的正确方法是什么?
它自动按照元组中的第一个元素排序,然后按照第二个元素依此类推进行排序。因此,tuple([1,2,3])将在tuple([1,2,4])之前。如果要覆盖此行为,请将可调用对象作为sort方法的第二个参数传递。该可调用对象应返回1、-1或0。
>>> import random
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)])
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8),
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)]
# l is the list of tuples
l.sort(lambda x,y: x-y)
您可以使用任何可调用的函数作为比较函数,不一定是lambda表达式。但是它需要返回-1(小于),0(等于)或1(大于)。
请查看“Devin Jeanpierre”在sort-a-dictionary-in-python-by-the-value中对这个问题的回答,他建议使用元组,并展示了如何按第二个值进行排序
operator.itemgetter
要比lambda函数更好:foo.sort(key=operator.itemgetter(1))
比foo.sort(key=lambda x: x[1])
更加简洁。不过这只是我的观点。 - Jarek Przygódzki