Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:在一系列元素上对列表进行排序_Python_List_Sorting_Numpy_Range - Fatal编程技术网

python:在一系列元素上对列表进行排序

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到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.  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