Я пытаюсь отсортировать список после 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()
возвращает список.
Похоже, вы хотите отсортировать по 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]
. Любая помощь будет оценена по достоинству.
Несмотря на то, что это сортирует l1
, как это отвечает на вопрос, как сортировать список после zip
?
@user19077881 user19077881 проверьте историю вопросов - в исходном вопросе не упоминался сжатый список. Я обновил свой ответ соответственно
@ajc2000 ajc2000 Извиняюсь — я никогда не видел неотредактированного вопроса, поэтому прокомментировал вопрос, который видел; редактирование значительно изменило вопрос, что является довольно запутанным подходом со стороны ФП.
Если вы хотите отсортировать список кортежей из «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)]
Связанный: Как отсортировать список строк чисел в Python