python:在一系列元素上对列表进行排序
我现在尝试了好几天来解决这个问题,但我就是无法解决这个问题 我有一个列表列表,其中每个列表由0到5的值组成:python:在一系列元素上对列表进行排序,python,list,sorting,numpy,range,Python,List,Sorting,Numpy,Range,我现在尝试了好几天来解决这个问题,但我就是无法解决这个问题 我有一个列表列表,其中每个列表由0到5的值组成: [[ 0. 0. 4. 2. 2. 2. 2. 2. 2. 2.] [ 0. 0. 1. 2. 3. 3. 3. 3. 3. 3.] [ 0. 0. 2. 3. 4. 4. 1. 2. 1. 2.] [ 0. 0. 3. 4. 5. 1. 4. 4. 5. 5.] ... [ 0. 0. 5. 3.
[[ 0. 0. 4. 2. 2. 2. 2. 2. 2. 2.]
[ 0. 0. 1. 2. 3. 3. 3. 3. 3. 3.]
[ 0. 0. 2. 3. 4. 4. 1. 2. 1. 2.]
[ 0. 0. 3. 4. 5. 1. 4. 4. 5. 5.]
...
[ 0. 0. 5. 3. 3. 3. 4. 3. 4. 3.]
[ 0. 0. 3. 4. 1. 1. 1. 1. 4. 4.]
[ 0. 0. 3. 4. 1. 3. 3. 3. 3. 1.]
[ 0. 0. 1. 4. 4. 5. 3. 4. 3. 1.]]
现在我想对这个列表进行排序,从最后一个元素开始,然后是最后一个元素,等等。一直到开始,得到如下结果:
[[ 0. 0. 3. 4. 1. 3. 3. 3. 3. 1.]
[ 0. 0. 1. 4. 4. 5. 3. 4. 3. 1.]
[ 0. 0. 5. 3. 3. 3. 3. 3. 4. 1.]
[ 0. 0. 2. 3. 4. 4. 1. 2. 1. 2.]
...
[ 0. 0. 3. 4. 1. 1. 1. 1. 4. 4.]
[ 0. 0. 3. 3. 3. 4. 4. 4. 4. 4.]
[ 0. 0. 4. 4. 3. 4. 5. 5. 1. 5.]
[ 0. 0. 3. 4. 5. 1. 4. 4. 5. 5.]]
我在网上找到的对排序数组/列表问题的所有答复都涉及不同的列/元素,而我无法让这些元素发挥作用。最终,唯一有效的解决方案是:
array = array[np.lexsort((array[:,-9], array[:,-8], array[:,-7], array[:,-6], array[:,-5], array[:,-4], array[:,-3], array[:,-2], array[:,-1]))]
这不仅很难看,而且也不太灵活。任何用循环或变量替换此命令的尝试都失败了
如有任何建议,将不胜感激 给定:
LoL=[[ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.,],
[ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.,],
[ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.,],
[ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.,],
[ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.,],
[ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.,],
[ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.,],
[ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.,]]
使用按键功能:
>>> sorted(LoL, key=lambda l: l[::-1])
[[0.0, 0.0, 3.0, 4.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0],
[0.0, 0.0, 1.0, 4.0, 4.0, 5.0, 3.0, 4.0, 3.0, 1.0],
[0.0, 0.0, 2.0, 3.0, 4.0, 4.0, 1.0, 2.0, 1.0, 2.0],
[0.0, 0.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0],
[0.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0],
[0.0, 0.0, 5.0, 3.0, 3.0, 3.0, 4.0, 3.0, 4.0, 3.0],
[0.0, 0.0, 3.0, 4.0, 1.0, 1.0, 1.0, 1.0, 4.0, 4.0],
[0.0, 0.0, 3.0, 4.0, 5.0, 1.0, 4.0, 4.0, 5.0, 5.0]]
如果这些是numpy数组,请使用ndarray.sort:
>>> m=np.matrix(LoL)
>>> m
array([[ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.],
[ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.],
[ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.],
[ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.],
[ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.],
[ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.],
[ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.],
[ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.]])
>>> m[m[:,-1].argsort()]
array([[ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.],
[ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.],
[ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.],
[ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.],
[ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.],
[ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.],
[ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.],
[ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.]])
使用以下排序功能
def mysort(list1,list2):
i = min(len(list1),len(list2))-1 # in case unequal lines
while (i>0) and list1[i]== list2[i]:
i -= 1
return cmp(list1[i],list2[i])
使用测试(打印正确答案)
您可以简单地转置输入数组,然后使用获得向量化的排序索引,从而获得非常有效的解决方案,如下所示-
array[np.lexsort(array[:,1:].T)]
样本运行-
In [128]: # Random array of integers
...: array = np.random.randint(0,9,(5,10))
...:
...: # Original method
...: A = ((array[:,-9], array[:,-8], array[:,-7], array[:,-6], array[:,-5], \
...: array[:,-4], array[:,-3], array[:,-2], array[:,-1]))
...: out_loopy = array[np.lexsort(A)]
...:
...: # Vectorized method
...: out_vectorized = array[np.lexsort(array[:,1:].T)]
...:
In [129]: np.allclose(out_loopy,out_vectorized)
Out[129]: True
我得到以下错误:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()。如果我再添加.any()或.all(),我会得到:TypeError:'numpy.bool_'对象不是iterableNumpy还有一个具有类似语法的内置版本。如果您确实确定子列表的长度都是10,则可以使用
I=9
。但这使代码更加健壮和通用。这是正确的方法。颠簸版本的已排序(LoL,key=lambda l:l[::-1])
。谢谢
In [128]: # Random array of integers
...: array = np.random.randint(0,9,(5,10))
...:
...: # Original method
...: A = ((array[:,-9], array[:,-8], array[:,-7], array[:,-6], array[:,-5], \
...: array[:,-4], array[:,-3], array[:,-2], array[:,-1]))
...: out_loopy = array[np.lexsort(A)]
...:
...: # Vectorized method
...: out_vectorized = array[np.lexsort(array[:,1:].T)]
...:
In [129]: np.allclose(out_loopy,out_vectorized)
Out[129]: True