2012-02-06 71 views
1

你好我想弄清楚如何通过多个变量对嵌套列表进行排序,而有些不会按1,2,3排序而是按预定列表排序。使用对象列表排序嵌套列表

例如:

List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

这将导致:

[[XD,1],[XD,2],[XD,3],[XT,2],[X5,2],[X5,3]] 

第一元件将由sortbylist和数字顺序简单地在第二元件进行排序。

SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

我当前已经尝试使用代码:

List.sort(key=SortByList.__getitem__ x: x[0]) 
List=sorted(List,key=itemgetter(1)) 

然而,这似乎并没有工作。任何提示?

一个做到这一点的最简单的方法是:

Result=sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 

回答

3

如何:

In [2]: List=[['XD',1],['XD',3],['XD',2],['X5',2],['X5',3],['XT',2]] 

In [3]: SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

In [4]: sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 
Out[4]: [['XD', 1], ['XD', 2], ['XD', 3], ['XT', 2], ['X5', 2], ['X5', 3]] 

它使用在你的问题解释两元素化合物的关键。

+0

这在python中直接运行时效果很好。然而,当你把它放在一个程序里面时,它似乎并没有对列表进行排序。有任何想法吗? – Daniel 2012-02-06 20:33:47

+0

@Ophion:这段代码只是输出结果;它不会将其分配回“List”。将其更改为'List = sorted(List,key = ...)'或使用'List.sort(key = ...)'。 – NPE 2012-02-06 20:39:37

2

这里的问题是,你正试图使用​​他们的名字对对象进行排序来获得排序顺序,但是你的对象没有任何引用他们的名字。除了在locals()globals()中搜索外,没有办法从您的对象XD中知道它被称为'XD'

这里最好的选择是将变量存储在字典中,而不是直接存储在作用域/名称空间中。所以从这个更改代码:

XD = MyObject(...) 
X5 = MyObject(...) 
XT = MyObject(...) 
List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

要这样:

XDict = {'XD': MyObject(...), 
     'X5': MyObject(...), 
     'XT': MyObject(...)} 
List = [[XDict['XD'],1],[XDict['XD'],3],[XDict['XD'],2], 
     [XDict['X5'],2],[XDict['X5'],3],[XDict['XT'],2]] 

List内容将是完全一样的,但现在你有办法的名称'XD''X5'相关联,'XT'与一个对象,所以当定义SortList时,你可以创建一个实际对象名称的名称:

SortByList=[XDict.get('XD'), XDict.get('XT'), XDict.get('XQ'), XDict.get('X5')] 
sorted(List, key=lambda k, i: (SortedByList.index(k), i)) 

通过这种方式,即使某些变量未定义,您也可以创建SortByList,如XQ将在此示例中。 SortByList中的那个条目只是None,当其他元素被排序时,这不会导致任何问题。

+0

我希望有一个更简单的答案。如果aix的建议不起作用,我会使用它。谢谢你的反馈。 – Daniel 2012-02-06 20:34:28