Часть программы составляет этот список,
[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']
В настоящее время я пытаюсь отсортировать его в алфавитном порядке по названию эволюции, а не по номеру. Есть ли способ сделать это, не меняя только порядок, в котором две вещи появляются в списке (например, «интеллект x 1»)?






Поскольку вы пытаетесь отсортировать то, что по сути является настраиваемыми данными, я бы выбрал настраиваемую сортировку.
Сортировка слиянием
Пузырьковая сортировка
Быстрая сортировка
Нет, вы хотите использовать встроенный метод сортировки с настраиваемым компаратором.
Это то, что сделал С.Лотт? Если нет, не могли бы вы поделиться примером кода?
Это ужасное предложение. Он пытается получить что-то для сортировки, а не для реализации сортировки. Существует большая разница. Один полезен, а другой - пустая трата времени.
Да, ни в коем случае не изобретайте велосипед, создавая нестандартную сортировку. Огромная трата времени.
Вы должны получить «ключ» из строки.
def myKeyFunc( aString ):
stuff, x, label = aString.partition(' x ')
return label
aList.sort( key= myKeyFunc )
Именно и именно то, что сказано. Это просто «хлам». «прочие неуказанные объекты» согласно Тезаурусу. Метод разделения строки возвращает три результата. Один из них - просто "вещи", которые больше никогда не будут использоваться.
В этом контексте материал перед «x» может иметь значение, но мы не можем сказать из вопроса, что это такое и что означает. Поскольку вопрос расплывчатый, мы можем называть это только «хламом».
Знаете ли вы, что вы можете использовать символы подчеркивания для частей кортежа, которые вы не будете использовать: _,_,label = aString.partition(' x ')
@Amoss: Некоторым это не нравится, и они предпочитают "настоящие" имена переменных. Некоторые предпочитают _.
Не зная, стандартизированы ли ваши предметы: 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, но вы, вероятно, поняли идею.
Ваше здоровье, Патрик
Лучше использовать key =, чем настраиваемый компаратор, когда это возможно, потому что настраиваемый компаратор должен вызываться n * log n раз, а для ключевой функции требуется только n вызовов.
Не знал этого. Спасибо рекурсивно!
Как насчет:
lst.sort(key=lamdba s: s.split(' x ')[1])
в вашем образце опечатка в слове lambda
Для этого вам нужно реализовать настраиваемое сравнение:
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)
В качестве побочного примечания, вам может показаться более удобным, если вы преобразуете это в список кортежей, а не в строки Unicode; в частности, именованные кортежи могут действительно улучшить читаемость кода.