Python, сортировка списка по ключу, что подстрока каждого элемента

Часть программы создает этот список,

[u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale']

В настоящее время я пытаюсь сортировать его по алфавиту по имени эволюции, а не по числу. Есть ли способ, которым я могу это сделать, просто не изменяя порядок, что две вещи появляются в списке (как в "intellect x 1" )?

Ответ 1

Вы должны получить "ключ" из строки.

def myKeyFunc( aString ):
    stuff, x, label = aString.partition(' x ')
    return label

aList.sort( key= myKeyFunc )

Ответ 2

Как насчет:

lst.sort(key=lamdba s: s.split(' x ')[1])

Ответ 3

Не зная, стандартизированы ли ваши позиции на 1 цифру, 1 пробел, 1 'x', 1 пробел, несколько слов, я написал это:

mylist = [u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale']
def sort(a, b):
  return cmp(" ".join(a.split()[2:]), " ".join(b.split()[2:]))

mylist.sort(sort)

Вы можете отредактировать синтаксический анализ внутри метода sort, но вы, вероятно, получите эту идею.

Cheers, Патрик

Ответ 4

Чтобы сделать это, вам нужно выполнить пользовательский сопоставление:

def myCompare(x, y):
   x_name = " ".join(x.split()[2:])
   y_name = " ".join(y.split()[2:])
   return cmp(x_name, y_name)

Затем вы используете это сравнение в качестве входа в свою функцию сортировки:

myList.sort(myCompare)