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

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

В качестве побочного примечания, вам может показаться более удобным, если вы преобразуете это в список кортежей, а не в строки Unicode; в частности, именованные кортежи могут действительно улучшить читаемость кода.

Greg Case 13.01.2009 23:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
1
11 475
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Нет, вы хотите использовать встроенный метод сортировки с настраиваемым компаратором.

Adam Rosenfield 13.01.2009 23:04

Это то, что сделал С.Лотт? Если нет, не могли бы вы поделиться примером кода?

Teifion 13.01.2009 23:09

Это ужасное предложение. Он пытается получить что-то для сортировки, а не для реализации сортировки. Существует большая разница. Один полезен, а другой - пустая трата времени.

ironfroggy 13.01.2009 23:20

Да, ни в коем случае не изобретайте велосипед, создавая нестандартную сортировку. Огромная трата времени.

Kiv 13.01.2009 23:50
Ответ принят как подходящий

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

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

aList.sort( key= myKeyFunc )

Именно и именно то, что сказано. Это просто «хлам». «прочие неуказанные объекты» согласно Тезаурусу. Метод разделения строки возвращает три результата. Один из них - просто "вещи", которые больше никогда не будут использоваться.

S.Lott 13.01.2009 23:13

В этом контексте материал перед «x» может иметь значение, но мы не можем сказать из вопроса, что это такое и что означает. Поскольку вопрос расплывчатый, мы можем называть это только «хламом».

S.Lott 13.01.2009 23:15

Знаете ли вы, что вы можете использовать символы подчеркивания для частей кортежа, которые вы не будете использовать: _,_,label = aString.partition(' x ')

Andrew 25.09.2010 18:46

@Amoss: Некоторым это не нравится, и они предпочитают "настоящие" имена переменных. Некоторые предпочитают _.

S.Lott 28.09.2010 07:00

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

recursive 13.01.2009 23:21

Не знал этого. Спасибо рекурсивно!

pboucher 14.01.2009 06:40

Как насчет:

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

в вашем образце опечатка в слове lambda

r0101 30.03.2017 19:48

Для этого вам нужно реализовать настраиваемое сравнение:

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)

Другие вопросы по теме