У меня есть два списка, которые я пытаюсь отсортировать по A1 B1 C1.
l1 = ['F2', 'G2', 'B2', 'H2', 'A3', 'E3', 'G3', 'C1', 'D1', 'E1', 'D2', 'C3', 'A1']
l2 = [40, 40, 90, 90, 90, 90, 90, 120, 120, 120, 120, 120, 90]
Код
l1, l2 = [list(i) for i in zip(*sorted(zip(l1, l2), key=lambda x: list(map(int,x[0][1:]))))]
print (l1)
print (l2)
Текущий выход:
['C1', 'D1', 'E1', 'A1', 'F2', 'G2', 'B2', 'H2', 'D2', 'A3', 'E3', 'G3', 'C3']
[120, 120, 120, 90, 40, 40, 90, 90, 120, 90, 90, 90, 120]
Вместо этого ожидаемый результат должен быть:
l1 = ['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3']
Как мне получить ожидаемый результат вместо того, что я получаю сейчас?






Я не совсем уверен, что пытается сделать ваш код. Я могу получить желаемый результат следующим образом:
l1 = list(sorted(l1, key=lambda item: (item[1], item[0])))
print(l1)
Выход:
['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', 'C3', 'E3', 'G3']
Примечание. Это решение работает только в том случае, если элементы в l1 имеют длину два символа ('A10' не будет отсортировано должным образом).
Вы не показываете l2 в желаемом результате.
Обновлять
Если вы хотите отсортировать оба списка одновременно, вы можете объединить их следующим образом:
combined = zip(l1, l2)
combined = list(sorted(combined, key=lambda item: (item[0][1], item[0][0])))
print(combined)
Выход:
[('A1', 90), ('C1', 120), ('D1', 120), ('E1', 120), ('B2', 90), ('D2', 120), ('F2', 40), ('G2', 40), ('H2', 90), ('A3', 90), ('C3', 120), ('E3', 90), ('G3', 90)]
Чтобы разархивировать объединенный результат, используйте следующие инструкции:
l1_sorted = [item[0] for item in combined]
l2_sorted = [item[1] for item in combined]
Вы также можете использовать функцию zip для распаковки, как описано здесь.
Список счетов l1 привязан к списку l2. При их сжатии создается кортеж [("C1", 120), ("D1", 120) и т. д.]
Ах я вижу. Я добавил обновление, показывающее, как сортировать объединенный список кортежей.
Результат должен быть следующим: l1 = ['A1', 'C1', 'D1', 'E1', 'B2', 'D2', 'F2', 'G2', 'H2', 'A3', ' C3', 'E3', 'G3'] l2 = [90, 120, 120, 120, 90, 90, 40, 40, 90, 90, 120, 90, 90]
Спасибо, Билл! Это потрясающе!
В следующий раз укажите в вопросе полный желаемый результат, чтобы было яснее, чего вы хотите.
Как бы вы отсортировали A10? т.е. ['A1', 'B1', 'C1', 'A2', 'B2', 'C2',, ......'A9', 'B9', 'C9', 'A10', ' Б10», «С10»?
Это нетрудно сделать. Сначала я бы разделил каждую строку на две части: буквенную часть (строка) и числовую часть (целое число). Затем вы можете передать этот список кортежей тому же алгоритму сортировки, который используется здесь.
Своими словами, каковы правила сортировки? Код предполагает, что вы хотите выполнить сортировку только по номерам элементов в
l1. Желаемый результат предполагает, что вы хотите отсортировать элементы вl1, сначала по конечному номеру, затем по букве. Как ваш код должен обрабатывать числа, состоящие более чем из одной цифры?'A1'стоит до или послеA10?