我有一個(gè)列表,其中包含不同大小的元素(有些甚至是空的),如下所示:a1 = [array([[83, 84]]), array([[21, 24], [32, 53],[54, 56]]), array([[21,24],[32, 37],[45, 46]]), [], []]在這個(gè)列表中,值要么是成對(duì)的(在數(shù)組中),要么就是空的。我想要做的就是根據(jù)它們的差異按降序?qū)λ袑?duì)進(jìn)行排序,并保留它們?cè)谠剂斜碇械奈恢?索引(即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 位置,下面僅指示元素的第一個(gè)索引也是一個(gè)合適的選擇:a1_index = [1,2,1,2,1,2,0,3,4]簡(jiǎn)單地迭代列表?xiàng)l目是我最初的方法,但處理空元素和不同的維度大小已經(jīng)減慢了這項(xiàng)工作的速度。關(guān)于最佳解決方案的任何想法?
2 回答

不負(fù)相思意
TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以使用enumerate為列表和子列表生成索引,然后使用列表理解來生成與它們的索引相結(jié)合的對(duì)作為元組進(jìn)行排序以輸出,并根據(jù)需要解壓縮到兩個(gè)不同的變量:
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 會(huì)成為:
[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46], [], []]
a1_index 會(huì)成為:
[[1, 1], [2, 1], [1, 0], [2, 0], [1, 2], [0, 0], [2, 2], [3, 0], [4, 0]]
添加回答
舉報(bào)
0/150
提交
取消