Python按多种条件排序数组

时间:2015-08-11 12:44:29

标签: python arrays sorting

如何按给定的索引集对数组进行排序,并优先考虑该索引中的值。截至目前,我无法通过整个数组中的特定索引对排序方法进行排序,因为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?有类似的任务,但零问题仍然存在

1 个答案:

答案 0 :(得分:3)

按多个条件排序时,应始终使用tuple s。 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,最后是索引2,你可以通过提供一个简单地重新排列这些元组的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)

将输出

(0, -3, 1),
(1, 3, 4),
(1, 3, 5),
(0, 5, 1)

现在,如果您希望索引为1(0)的x[1] == 0元素成为最后一个元素,则必须将此条件添加到sorter函数返回的元组的开头:

sorter = lambda x: (x[1] == 0, x[1], x[0], x[2])

这与以前完全相同,但是在开头添加了x[1] == 0,所以首先我们将0的内容添加到结尾。您也可以对x[0] == 0x[2] == 0重复此操作,因此您的最终版本将为:sorted(tmpList, key=lambda x: (x[1] == 0, x[1], x[0] == 0, x[0], x[2] == 0, x[2]))