Ответ 1
list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2),
key=operator.itemgetter(0), reverse=True))
У меня есть два списка в Python
list_1 = [5, 2, 8];
list_2 = ['string1', 'string2', 'string3']
Я хотел бы отсортировать список кулаков и использовать результат для сортировки второго списка.
Другими словами, результат должен быть:
# Sorted in descending order
list_1_sorted = [8, 5, 2];
list_2_sorted = ['string3', 'string1', 'string2'];
Я знаю, как сортировать каждый из этих списков индивидуально, но как я могу переставить один список, используя перестановку индексов, полученных при сортировке другого списка?
list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2),
key=operator.itemgetter(0), reverse=True))
Сопоставьте списки вместе, сортируйте, разархивируйте списки:
together = zip(list_1, list_2)
sorted_together = sorted(together)
list_1_sorted = [x[0] for x in sorted_together]
list_2_sorted = [x[1] for x in sorted_together]
Что здесь происходит, так это то, что zip создает список кортежей, с элементами, которые вы хотите отсортировать список, будучи первыми элементами:
>>> a = [1,3,7,3,2]
>>> b = ["one","two",'three','four','five']
>>> zip(a,b)
[(1, 'one'), (3, 'two'), (7, 'three'), (3, 'four'), (2, 'five')]
Затем, когда вы их сортируете, элементы остаются в паре:
>>> sorted(zip(a,b))
[(1, 'one'), (2, 'five'), (3, 'four'), (3, 'two'), (7, 'three')]
Затем все, что осталось, - это распаковать эти списки.
Вы можете использовать zip
:
>>> list_1 = ['string1', 'string2', 'string3']
>>> list_2 = [5, 2, 8]
>>> s = sorted(zip(list_2, list_1), reverse=True)
>>> list_1_sorted = [e[1] for e in s]
>>> list_2_sorted = [e[0] for e in s]
>>> list_1_sorted
['string3', 'string1', 'string2']
>>> list_2_sorted
[8, 5, 2]
>>>
@Ответ на Ignacio является лучшим, но на всякий случай вам нужно отсортировать списки на месте без создания новых списков, вы можете попробовать следующее:
import itertools
list_enumerate = itertools.count()
list_2.sort(reverse=True, key=lambda k: list_1[next(list_enumerate)])
list_1.sort(reverse=True)
print list_1
print list_2
Обратите внимание, что я не думаю, что есть гарантия, что функция key
вызывается для каждого элемента списка в порядке (что необходимо для этого), поэтому это опасный метод для использования.