2016-03-30 98 views
2

我現在正在嘗試幾天來解決這個問題,但我不能得到任何問題。python:排序列表中的一系列元素列表

我有列表,其中每個列表由值從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]))] 

這不僅非常難看,但也不是很靈活。用循環或變量替換這個命令的任何嘗試都會失敗。

任何建議將非常感謝!

回答

2

你可以簡單地轉輸入數組,然後使用np.lexsort獲得排序指標的量化,因此非常高效的解決方案,像這樣 -

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 
+1

這是正確的做法。排序(LoL,key = lambda l:l [:: - 1])的顛簸版本''。謝謝 – dawg

2

考慮:

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.]]) 
+0

我得到這個以下錯誤: ValueError:具有多個元素的數組的真值不明確。使用a.any()或a.all()。 如果我再加入.ANY()或。所有()我得到: 類型錯誤:「numpy.bool_」對象不是可迭代 –

+0

看編輯爲NP版本 – dawg

+0

嘗試更新... – dawg

0

使用以下排序功能

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]) 

測試了(它打印出正確答案)

LL = [[ 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,]] 

LL.sort(mysort) 
print (LL) 
+0

如果你真的確定子列表的長度都是10,那麼你可以使用'i = 9'。但是這使得代碼更加強大和多功能。 –