2013-01-08 43 views
10

自定義命令我有一個列表排序可以用Python

mylist = [['123', 'BOOL', '234'], ['345', 'INT', '456'], ['567', 'DINT', '678']]

我想它的1 DINT 2. INT 3. BOOL

結果的順序排序列表:

[['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]

我已經在stackove中看到過其他類似的問題rflow,但沒有類似或容易適用於我。

+0

你有語法錯誤:「345未關閉。 –

+0

「我想按照1. DINT 2. INT 3. BOOL的順序對它進行排序。那是什麼順序?如果我添加另一個項目'[''317.3','FLOAT','268.0']',我怎麼知道它在分類輸出中的位置? –

+0

@KarlKnechtel嗯,這個的完整應用是對REAL(float),DINT,INT,SINT,BOOL進行排序。這是我想要的順序(從大到小)。這裏的這個問題僅用於說明目的。 '123','234','345'......都沒有真正的意義。 – elwc

回答

26
SORT_ORDER = {"DINT": 0, "INT": 1, "BOOL": 2} 

mylist.sort(key=lambda val: SORT_ORDER[val[1]]) 

我們在這裏所做的是提供一個新的元素,通過爲列表中的每個元素返回一個整數而不是整個列表。我們可能使用內聯三元表達式,但這將有點笨拙。

+0

對不起,我將編輯這個問題 – elwc

+0

我不知道我在想什麼,但是我得到了一些語法錯誤 – elwc

+0

@elwc - 什麼樣的錯誤? –

0

因爲這不是按照aphabetical順序,我不認爲有一個單一的函數可以對它進行排序,但你可以做的是創建一個新的列表,然後追加。這是一種便宜的方法;但它完成了工作。

newlist=[]; 
for sub_list in mylist: 
    if(sub_list[1] == 'DINT']): 
      newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'INT']): 
     newlist.append(sub_list); 

for sub_list in mylist: 
    if(sub_list[1] == 'BOOL']): 
      newlist.append(sub_list); 
+0

大括號? 'from __future__ import braces' ;-)另外,請參閱我的答案 - 您只需要遍歷一次列表:-) –

+0

是的,我更喜歡其他答案。雙線解決方案。 – elwc

+1

即使這種方法有意義,對於所有聖潔的愛,也可以使用列表解析或「過濾器」等。 –

-1
 python 3.2 

    1. sorted(mylist,key=lambda x:x[1][1]) 

    2. sorted(mylist,reverse=True)