2013-01-08 42 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)