Сортировка списка в буквенно-цифровом порядке

Я пытаюсь отсортировать список после zip.

list_sort = zip(l1, l2)

l1 = ['F2', 'G2', 'A10', 'H2', 'A3', 'E3', 'B10', 'C1', 'D1', 'E1', 'D2', 'C11', 'A1']
l2 = [40, 40, 90, 90, 90, 90, 90, 120, 120, 120, 120, 120, 90]

Я хочу отсортировать l1 в следующем порядке:

l1 = ['A1', 'C1', 'D1', 'E1', 'D2', 'F2', 'G2', 'H2', 'A3', 'E3', 'A10', 'B10', 'C11']

l2 будет сортироваться с помощью l1.

l2 = [90, 120, 120, 120, 120, 40, 40, 90, 90, 90, 90, 90, 120]

Что я пробовал:

list(sorted(list_sort, key=lambda item: (item[0][1], item[0][1:0])))

Примечание: list(sorted()) является избыточным, поскольку sorted() возвращает список.

wjandrea 02.05.2024 00:37
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Похоже, вы хотите отсортировать по 2 критериям: сначала по значению числа в конце строки, а затем по начальной букве.

Похоже, вы поменяли порядок своих критериев, и у вас также есть [1:0] в качестве индекса для получения значения числа, которое имеет исключительный конечный индекс 0, что приведет к пустой строке.

Вместо этого вы хотите сначала выполнить сортировку по числу, следующему за первым символом строки. Вы можете получить его строковое значение с помощью item[1:], а затем применить int(item[1:]), чтобы преобразовать его в число. Тогда ваш второй критерий — это сам первый символ (который для вашего списка всегда является буквой), который можно получить с помощью item[0]

Итак, ваш новый ключ будет (int(item[1:]), item[0]).

Чтобы отсортировать zip(l1, l2) по этим критериям, следующее должно дать желаемый результат:

zipped = zip(l1, l2)
sorted_zip = sorted(zipped, key=lambda item: (int(item[0][1:]), item[0][0]))

Это позволит отсортировать сжатый список по критериям l1, поскольку соответствующая запись l1 получается с помощью item[0] для записи item в сжатом списке. Затем, если вы хотите разархивировать это:

sorted_l1 = [item[0] for item in sorted_zip]
sorted_l2 = [item[1] for item in sorted_zip]

отличное объяснение. Я отредактировал свой вопрос, чтобы дать больше контекста того, почему у меня был item[0][1]. Любая помощь будет оценена по достоинству.

Michael Davila 02.05.2024 00:49

Несмотря на то, что это сортирует l1, как это отвечает на вопрос, как сортировать список после zip?

user19077881 02.05.2024 01:23

@user19077881 user19077881 проверьте историю вопросов - в исходном вопросе не упоминался сжатый список. Я обновил свой ответ соответственно

ajc2000 02.05.2024 01:42

@ajc2000 ajc2000 Извиняюсь — я никогда не видел неотредактированного вопроса, поэтому прокомментировал вопрос, который видел; редактирование значительно изменило вопрос, что является довольно запутанным подходом со стороны ФП.

user19077881 03.05.2024 19:45

Если вы хотите отсортировать список кортежей из «zip», вы можете использовать:

sorted(list_sort, key=lambda item: (int(item[0][1:]), item[1]))

item[0] — это первый элемент кортежа из l1, а item[0][1:] — это цифры после первой буквы. item[1] — второй элемент кортежа, производный от l2. Результат:

[('A1', 90), ('C1', 120), ('D1', 120), ('E1', 120), ('F2', 40), ('G2', 40), ('H2', 90), ('D2', 120), ('A3', 90), ('E3', 90), ('A10', 90), ('B10', 90), ('C11', 120)]

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