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

排序多维列表 - Python

排序多维列表 - Python

开满天机 2022-09-06 19:44:09
我有一个3d列表列表或numpy数组,我需要按最小的第一个项目索引对其进行排序。这是我在这个程序上做的最后两个试探。对不起,我很确定这是一个简单/愚蠢的问题,但作为编程“思维方式”的新手,这对我来说有点困难。首次尝试: lstsArray = [[[54,21,31], [1,2,3], [15,25,35]],              [[12,22,32], [3,2,1], [16,26,36]],              [[34,24,38], [0.1,1,1], [17,27,37]]] val = np.array(lstsArray) menor = 120e26 for item in val:     for i in item:         if menor >= i[0] and i[0] >= min(i):             menor = i[0] print(menor) lstA = list(val) a = sorted(lstA, key=itemgetter(menor)) print(a)第二次尝试for i in val:    for j in i:        print(sorted((i), key =itemgetter(j[0])))所需输出[[[0.1,1,1],[1,2,3],[3,2,1]], [[12,22,32],[15,25,35],[16,26,36]], [[17,27,37],[34,24,38],[54,21,31]]] 
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您的列表,以及由它组成的数组。请注意数组中的浮点数:


In [124]: lstsArray = [[[54,21,31], [1,2,3], [15,25,35]], 

     ...:               [[12,22,32], [3,2,1], [16,26,36]], 

     ...:               [[34,24,38], [0.1,1,1], [17,27,37]]]                                                         

In [125]: val=np.array(lstsArray)                                                                                    

In [126]: val                                                                                                        

Out[126]: 

array([[[54. , 21. , 31. ],

        [ 1. ,  2. ,  3. ],

        [15. , 25. , 35. ]],


       [[12. , 22. , 32. ],

        [ 3. ,  2. ,  1. ],

        [16. , 26. , 36. ]],


       [[34. , 24. , 38. ],

        [ 0.1,  1. ,  1. ],

        [17. , 27. , 37. ]]])

这是一个 (3,3,3) 整形数组。但是您的排序忽略了初始 (3,3) 布局,因此让我们继续重塑它:


In [133]: val = np.array(lstsArray).reshape(-1,3)                                                                    

In [134]: val                                                                                                        

Out[134]: 

array([[54. , 21. , 31. ],

       [ 1. ,  2. ,  3. ],

       [15. , 25. , 35. ],

       [12. , 22. , 32. ],

       [ 3. ,  2. ,  1. ],

       [16. , 26. , 36. ],

       [34. , 24. , 38. ],

       [ 0.1,  1. ,  1. ],

       [17. , 27. , 37. ]])

现在,我们可以轻松地在第一列值上重塑形状。 给出排序顺序:argsort


In [135]: idx = np.argsort(val[:,0])                                                                                 

In [136]: idx                                                                                                        

Out[136]: array([7, 1, 4, 3, 2, 5, 8, 6, 0])

In [137]: val[idx]                                                                                                   

Out[137]: 

array([[ 0.1,  1. ,  1. ],

       [ 1. ,  2. ,  3. ],

       [ 3. ,  2. ,  1. ],

       [12. , 22. , 32. ],

       [15. , 25. , 35. ],

       [16. , 26. , 36. ],

       [17. , 27. , 37. ],

       [34. , 24. , 38. ],

       [54. , 21. , 31. ]])

并让它回到3d:


In [138]: val[idx].reshape(3,3,3)                                                                                    

Out[138]: 

array([[[ 0.1,  1. ,  1. ],

        [ 1. ,  2. ,  3. ],

        [ 3. ,  2. ,  1. ]],


       [[12. , 22. , 32. ],

        [15. , 25. , 35. ],

        [16. , 26. , 36. ]],


       [[17. , 27. , 37. ],

        [34. , 24. , 38. ],

        [54. , 21. , 31. ]]])

或在列表显示中:


In [139]: val[idx].reshape(3,3,3).tolist()                                                                           

Out[139]: 

[[[0.1, 1.0, 1.0], [1.0, 2.0, 3.0], [3.0, 2.0, 1.0]],

 [[12.0, 22.0, 32.0], [15.0, 25.0, 35.0], [16.0, 26.0, 36.0]],

 [[17.0, 27.0, 37.0], [34.0, 24.0, 38.0], [54.0, 21.0, 31.0]]]

但是,如果列表只有一个嵌套级别:


In [140]: alist = val.tolist()                                                                                       

In [141]: alist                                                                                                      

Out[141]: 

[[54.0, 21.0, 31.0],

 [1.0, 2.0, 3.0],

 [15.0, 25.0, 35.0],

 [12.0, 22.0, 32.0],

 [3.0, 2.0, 1.0],

 [16.0, 26.0, 36.0],

 [34.0, 24.0, 38.0],

 [0.1, 1.0, 1.0],

 [17.0, 27.0, 37.0]]

Python排序工作得很好:


In [142]: sorted(alist, key=lambda x:x[0])   # or itemgetter                                                                           

Out[142]: 

[[0.1, 1.0, 1.0],

 [1.0, 2.0, 3.0],

 [3.0, 2.0, 1.0],

 [12.0, 22.0, 32.0],

 [15.0, 25.0, 35.0],

 [16.0, 26.0, 36.0],

 [17.0, 27.0, 37.0],

 [34.0, 24.0, 38.0],

 [54.0, 21.0, 31.0]]

您有一个双嵌套列表,但希望排序忽略一个图层,这一事实使列表处理复杂化。这就是重塑有很大帮助的地方。numpy


目前,我不会测试这些方法的相对速度。


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

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