Python, сортировка списка по ключу, который является подстрокой каждого элемента - PullRequest
10 голосов
/ 13 января 2009

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

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

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

Ответы [ 5 ]

23 голосов
/ 13 января 2009

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

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

aList.sort( key= myKeyFunc )
10 голосов
/ 13 января 2009

Как насчет:

lst.sort(key=lamdba s: s.split(' x ')[1])
2 голосов
/ 13 января 2009

Не зная, стандартизированы ли ваши элементы в 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, но вы, вероятно, поняли идею.

Ура, Patrick

1 голос
/ 13 января 2009

Для этого необходимо реализовать пользовательское сравнение:

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)
0 голосов
/ 13 января 2009

Поскольку вы пытаетесь отсортировать по сути пользовательские данные, я бы выбрал пользовательскую сортировку.

Сортировка слиянием
Пузырьковая сортировка
Quicksort

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