如何根据一组给定的索引对数组进行排序,并确定该索引中的值的优先级。到目前为止,我还不能让sort方法在整个数组中按特定的索引排序,因为0值会导致问题。
例如,首先按索引1排序,然后按索引0排序,最后按2排序
tmpList = [[0,-10,0],[0,10,0],[0,5,0],[1,0,0],[0,0,-1],[0,0,0],[0,0,5]]
Res = sorted(tmpList, key=lambda x: x[1] )
>>[[0, -10, 0], [1, 0, 0], [0, 0, -1], [0, 0, 0], [0, 0, 5], [0, 5, 0], [0, 10, 0]]在这种排序中,我需要更多的灵活性,这样我就可以将索引中非零的值作为优先级,因此它将按如下方式排序:
[[0,-10,0],[0,5,0],[0,10,0],[1,0,0],[0,0,-1],[0,0,5],[0,0,0]]
How to sort in python with multiple conditions?也有类似的任务,但是零问题仍然存在
发布于 2015-08-11 20:47:41
当按多个条件排序时,你应该总是使用tuples。Python内置的sorted()将通过比较元组中的第一个值来对列表进行排序,如果它们相等,则第二个值,如果它们也等于第三个值,等等。
示例:sorted([(0, 5, 1), (1, 3, 4), (0, -3, 1), (1, 3, 5)])将输出
(0, -3, 1),
(0, 5, 1),
(1, 3, 4),
(1, 3, 5)如果您希望排序以自定义顺序进行,在您的情况下,索引1的优先级高于索引0,您可以通过提供一个简单地重新排列这些元组的lambda函数来实现:
>>> l = [(0, 5, 1), (1, 3, 4), (0, -3, 1), (1, 3, 5)]
>>> sorter = lambda x: (x[1], x[0], x[2])
>>> sorted_l = sorted(l, key=sorter)这将输出:
(0, -3, 1),
(1, 3, 4),
(1, 3, 5),
(0, 5, 1)现在,如果希望在索引1 (x[1] == 0)处具有0的元素是最后一个元素,则必须将此条件添加到sorter函数返回的元组的开头:
sorter = lambda x: (x[1] == 0, x[1], x[0], x[2])这与之前完全相同,但在开头添加了x[1] == 0。这种比较将产生True或False,并且由于False被表示为0,而True被表示为1,因此我们可以在排序时推断出False < True,因此那些x[1] != 0将首先出现的元素。从本质上讲,这将对那些以0开头直到最后的元素进行排序。您也可以对x[0] == 0和x[2] == 0重复此操作,因此最终版本将为:sorted(tmpList, key=lambda x: (x[1] == 0, x[1], x[0] == 0, x[0], x[2] == 0, x[2]))
https://stackoverflow.com/questions/31942169
复制相似问题