Сортировка вложенного списка со списком объектов - PullRequest
1 голос
/ 06 февраля 2012

Здравствуйте. Я пытаюсь выяснить, как отсортировать вложенный список по нескольким переменным, в то время как некоторые не будут отсортированы по 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={'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 ]

3 голосов
/ 06 февраля 2012

Как насчет:

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]]

Используется составной ключ из двух элементов, как описано в вашем вопросе.

2 голосов
/ 06 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...