首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python按多个条件对数组数组进行排序

Python按多个条件对数组数组进行排序
EN

Stack Overflow用户
提问于 2015-08-11 20:44:29
回答 1查看 9.7K关注 0票数 0

如何根据一组给定的索引对数组进行排序,并确定该索引中的值的优先级。到目前为止,我还不能让sort方法在整个数组中按特定的索引排序,因为0值会导致问题。

例如,首先按索引1排序,然后按索引0排序,最后按2排序

代码语言:javascript
复制
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?也有类似的任务,但是零问题仍然存在

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-11 20:47:41

当按多个条件排序时,你应该总是使用tuples。Python内置的sorted()将通过比较元组中的第一个值来对列表进行排序,如果它们相等,则第二个值,如果它们也等于第三个值,等等。

示例:sorted([(0, 5, 1), (1, 3, 4), (0, -3, 1), (1, 3, 5)])将输出

代码语言:javascript
复制
(0, -3, 1),
(0, 5, 1),
(1, 3, 4),
(1, 3, 5)

如果您希望排序以自定义顺序进行,在您的情况下,索引1的优先级高于索引0,您可以通过提供一个简单地重新排列这些元组的lambda函数来实现:

代码语言:javascript
复制
>>> 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)

这将输出:

代码语言:javascript
复制
(0, -3, 1),
(1, 3, 4),
(1, 3, 5),
(0, 5, 1)

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

代码语言:javascript
复制
sorter = lambda x: (x[1] == 0, x[1], x[0], x[2])

这与之前完全相同,但在开头添加了x[1] == 0。这种比较将产生TrueFalse,并且由于False被表示为0,而True被表示为1,因此我们可以在排序时推断出False < True,因此那些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]))

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31942169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档