Сортировка списка в соответствии с соответствующими значениями из параллельного списка
Заголовок: Как отсортировать один список, используя значения из другого, сохранив их связь?
У меня есть список строк, выглядящий следующим образом:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [0, 1, 1, 0, 1, 2, 2, 0, 1]
Какой самый короткий способ отсортировать список X с использованием значений из списка Y, чтобы получить следующий результат?
["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Порядок элементов с одинаковыми "ключами" не важен. Я могу использовать конструкции for
, но мне любопытно, есть ли более короткий способ. Есть ли у вас предложения?
5 ответ(ов)
Чтобы объединить два списка, отсортировать их и получить нужные элементы, можно использовать следующий однострочный код:
x_sorted = [x for y, x in sorted(zip(Y, X))]
Здесь происходит следующее:
- Используется функция
zip
, чтобы объединить спискиY
иX
в пары (здесь Y - это список, содержащий, например, индексы, а X - это список значений). - Затем применяется
sorted
для сортировки этих пар. Сортировка происходит по первому элементу каждой пары (т.е. по элементам из списка Y). - Наконец, используется генератор списка, чтобы извлечь второй элемент из каждой пары, возвращая отсортированный список значений из X.
В результате вы получите новый отсортированный список x_sorted
, в котором элементы из X
будут упорядочены в соответствии с соответствующими индексами из Y
.
Если вы не против использовать массивы numpy (или уже работаете с ними), вот еще одно хорошее решение:
people = ['Jim', 'Pam', 'Micheal', 'Dwight']
ages = [27, 25, 4, 9]
import numpy
people = numpy.array(people)
ages = numpy.array(ages)
inds = ages.argsort()
sortedPeople = people[inds]
Я нашел это здесь: http://scienceoss.com/sort-one-list-by-another-list/
Вам нужно отсортировать list_b
в соответствии с порядком элементов в list_a
. Вы можете использовать функцию sorted()
с параметром key
, чтобы задать порядок сортировки. В данном случае вы можете использовать метод index()
для получения индекса элемента из list_a
, чтобы правильно отсортировать list_b
.
Ваш код выглядит в целом правильно, вот пример, который вы можете использовать:
list_a = ['foo', 'bar', 'baz']
list_b = ['baz', 'bar', 'foo']
sorted_list_b = sorted(list_b, key=lambda x: list_a.index(x))
print(sorted_list_b) # ['foo', 'bar', 'baz']
В результате, sorted_list_b
будет содержать элементы из list_b
, отсортированные в соответствии с порядком, определённым в list_a
. Обратите внимание, что если в list_b
будут элементы, отсутствующие в list_a
, код вызовет ошибку.
В качестве альтернативы, объединяющей несколько ответов, вы можете использовать следующий код:
zip(*sorted(zip(Y, X)))[1]
Для того чтобы это работало в Python 3, вам нужно немного адаптировать синтаксис:
list(zip(*sorted(zip(B, A))))[1]
Этот код сначала создает список пар (B, A), сортирует его, а затем распаковывает обратно, извлекая второй элемент из отсортированных пар. Обратите внимание, что функция zip
возвращает итератор в Python 3, поэтому мы оборачиваем его в list
, чтобы получить доступ к элементам по индексу.
Если вам нужно получить список отсортированных индексов, то это отличный способ сохранить порядок элементов исходного списка. Вы можете использовать этот подход для сортировки любого списка в том же порядке, что и исходный. Как только у вас есть список отсортированных индексов, использование спискового выражения решит задачу. Вот пример:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [0, 1, 1, 0, 1, 2, 2, 0, 1]
sorted_y_idx_list = sorted(range(len(Y)), key=lambda x: Y[x])
Xs = [X[i] for i in sorted_y_idx_list]
print("Xs:", Xs)
# вывод: Xs: ["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Обратите внимание, что также можно получить отсортированный индексный список с помощью функции numpy.argsort()
.
Как отсортировать список словарей по значению словаря в Python?
Как отсортировать список объектов по атрибуту объектов?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как изменить порядок столбцов в DataFrame?