6

Сортировка списка в соответствии с соответствующими значениями из параллельного списка

1

Заголовок: Как отсортировать один список, используя значения из другого, сохранив их связь?

У меня есть список строк, выглядящий следующим образом:

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 ответ(ов)

1

Чтобы объединить два списка, отсортировать их и получить нужные элементы, можно использовать следующий однострочный код:

x_sorted = [x for y, x in sorted(zip(Y, X))]

Здесь происходит следующее:

  1. Используется функция zip, чтобы объединить списки Y и X в пары (здесь Y - это список, содержащий, например, индексы, а X - это список значений).
  2. Затем применяется sorted для сортировки этих пар. Сортировка происходит по первому элементу каждой пары (т.е. по элементам из списка Y).
  3. Наконец, используется генератор списка, чтобы извлечь второй элемент из каждой пары, возвращая отсортированный список значений из X.

В результате вы получите новый отсортированный список x_sorted, в котором элементы из X будут упорядочены в соответствии с соответствующими индексами из Y.

1

Если вы не против использовать массивы 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/

0

Вам нужно отсортировать 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, код вызовет ошибку.

0

В качестве альтернативы, объединяющей несколько ответов, вы можете использовать следующий код:

zip(*sorted(zip(Y, X)))[1]

Для того чтобы это работало в Python 3, вам нужно немного адаптировать синтаксис:

list(zip(*sorted(zip(B, A))))[1]

Этот код сначала создает список пар (B, A), сортирует его, а затем распаковывает обратно, извлекая второй элемент из отсортированных пар. Обратите внимание, что функция zip возвращает итератор в Python 3, поэтому мы оборачиваем его в list, чтобы получить доступ к элементам по индексу.

0

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

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().

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь