使用对象列表对嵌套列表进行排序

时间:2012-02-06 17:52:55

标签: python list sorting nested

你好我试图弄清楚如何用多个变量对嵌套列表进行排序,而有些则不会被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]))

2 个答案:

答案 0 :(得分: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]]

这使用了一个双元素复合键,如您的问题中所述。

答案 1 :(得分:2)

这里的问题是您尝试使用其名称对对象进行排序以获取排序顺序,但您的对象没有任何对其名称的引用。除了在XD'XD'中搜索它之外,无法从您的对象locals()告知它被称为globals()

这里最好的选择是将变量存储在字典中,而不是直接存储在范围/命名空间中。所以改变你的代码:

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,当其他元素排序时不会导致任何问题。