猿问

在不同维度的列表中对对进行排序

我有一个列表,其中包含不同大小的元素(有些甚至是空的),如下所示:


a1 =  [array([[83, 84]]), array([[21, 24], [32, 53],[54, 56]]), array([[21,24],[32, 37],[45, 46]]), [], []]


在这个列表中,值要么是成对的(在数组中),要么就是空的。我想要做的就是根据它们的差异按降序对所有对进行排序,并保留它们在原始列表中的位置/索引(即a1)。例如,我想要的输出是:


a1_sorted = [[32,53],[32,37],[21,24],[21,24],[54,56],[45,46],[83,84],[],[]] a1_index = [[1,1],[2,1],[1,0],[2,0],[1,2],[2,2],[0,0],[3,0],[4,0]]


由于空元素没有 2D 位置,下面仅指示元素的第一个索引也是一个合适的选择:


a1_index = [1,2,1,2,1,2,0,3,4]


简单地迭代列表条目是我最初的方法,但处理空元素和不同的维度大小已经减慢了这项工作的速度。关于最佳解决方案的任何想法?


芜湖不芜
浏览 148回答 2
2回答

不负相思意

您可以使用enumerate为列表和子列表生成索引,然后使用列表理解来生成与它们的索引相结合的对作为元组进行排序以输出,并根据需要解压缩到两个不同的变量:a1_sorted, a1_index = zip(*sorted(((t, [i, j])                      for i, l in enumerate(a1) for j, t in enumerate(list(l) or [[]])),                      key=lambda t: -abs(t[0][1] - t[0][0]) if len(t[0]) else 0))a1_sorted 会成为:[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46], [], []]a1_index 会成为:[[1, 1], [2, 1], [1, 0], [2, 0], [1, 2], [0, 0], [2, 2], [3, 0], [4, 0]]
随时随地看视频慕课网APP

相关分类

Python
我要回答