排序多维列表 - Python

我有一个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]]] 


开满天机
浏览 92回答 1
1回答

蝴蝶不菲

您的列表,以及由它组成的数组。请注意数组中的浮点数: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. ]])现在,我们可以轻松地在第一列值上重塑形状。 给出排序顺序:argsortIn [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目前,我不会测试这些方法的相对速度。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python