亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

排序多維列表 - 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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號