你好我试图弄清楚如何用多个变量对嵌套列表进行排序,而有些则不会被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]))
答案 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
,当其他元素排序时不会导致任何问题。