Проблема здесь в том, что вы пытаетесь отсортировать объекты, используя их имена, чтобы получить порядок сортировки, но ваши объекты не имеют никакой ссылки на их имя. От вашего объекта 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
, что не вызовет проблем при сортировке других элементов.