为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2021-06-28 17:51:18
我有一个列表,其中包含不同大小的元素(有些甚至是空的),如下所示: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]简单地迭代列表条目是我最初的方法,但处理空元素和不同的维度大小已经减慢了这项工作的速度。关于最佳解决方案的任何想法?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您可以使用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]]


查看完整回答
反对 回复 2021-07-06
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信