У меня есть список строк, как это:
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
конструкций, но мне любопытно, если есть более короткий путь. Какие-либо предложения?
Ответы:
Кратчайший код
Пример:
Вообще говоря
Разъяснение:
zip
дваlist
с.list
зависимости отzip
использованияsorted()
.list
.Для получения дополнительной информации о том, как установить \ использовать
key
параметр, а такжеsorted
функцию в целом, взгляните на это .источник
Сожмите два списка вместе, рассортируйте их, затем возьмите нужные части:
Объедините их вместе, чтобы получить:
источник
X
есть списокstr
, но будьте осторожны, если есть возможность, которая<
не определена для некоторых пар предметовX
, например, - если некоторые из них былиNone
AttributeError: 'zip' object has no attribute 'sort'
это то , что я получаю сейчас.sorted(zip(...))
должен все еще работать, или:them = list(zip(...)); them.sort()
Кроме того, если вы не возражаете против использования numpy-массивов (или на самом деле уже имеете дело с numpy-массивами ...), вот еще одно приятное решение:
Я нашел это здесь: http://scienceoss.com/sort-one-list-by-another-list/
источник
sortedArray1= array1[array2.argsort()]
. И это также упрощает сортировку нескольких списков по определенному столбцу 2D-массива: например,sortedArray1= array1[array2[:,2].argsort()]
для сортировки array1 (который может иметь несколько столбцов) по значениям в третьем столбце array2.Самым очевидным решением для меня является использование
key
ключевого слова arg.Обратите внимание, что вы можете сократить это до одной строки, если вы хотите:
источник
Я на самом деле пришел сюда, чтобы отсортировать список по списку, где значения совпадают.
источник
index
выполнит поиск O (N) поlist_a
результатамO(N² log N)
сортировки.more_itertools
имеет инструмент для параллельной сортировки итераций:Данный
демонстрация
источник
Мне нравится иметь список отсортированных индексов. Таким образом, я могу отсортировать любой список в том же порядке, что и список источников. Как только у вас есть список отсортированных индексов, простое понимание списка сделает свое дело:
Обратите внимание, что отсортированный список индексов также можно получить с помощью
numpy.argsort()
.источник
Еще одна альтернатива, объединяющая несколько ответов.
Чтобы работать на python3:
источник
zip, сортировка по второму столбцу, возврат первого столбца.
источник
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
Быстрый однострочник.
Скажем, вы хотите, чтобы список a соответствовал списку b.
Это полезно, когда нужно упорядочить меньший список со значениями в большем. Предполагая, что большой список содержит все значения в меньшем списке, это можно сделать.
источник
X
иY
?index
выполнит поиск O (N) поlist_b
результатамO(N² log N)
сортировки.Вы можете создать
pandas Series
, используя первичный список какdata
и другой список какindex
, а затем просто отсортировать по индексу:вывод:
источник
Вот ответ Whatangs, если вы хотите получить оба отсортированных списков (python3).
Просто помните, что Zx и Zy - это кортежи. Я также брожу, если есть лучший способ сделать это.
Предупреждение: если вы запускаете его с пустыми списками, он вылетает.
источник
Я создал более общую функцию, которая сортирует более двух списков на основе другого, вдохновленного ответом @ Whatang.
источник
Чтобы получить уникальные значения, присутствующие в
list2
Найти местоположение индекса в
list2
Расположение индекса в
list2
отслеживается с помощьюcur_loclist
[0, 3, 7, 1, 2, 4, 8, 5, 6]
источник
Это старый вопрос, но некоторые ответы, которые я вижу опубликованными, на самом деле не работают, потому что они
zip
не предназначены для сценариев. Другие ответы не удосужилисьimport operator
и предоставить больше информации об этом модуле и его преимуществах здесь.Есть как минимум две хорошие идиомы для этой проблемы. Начиная с примера ввода, который вы предоставили:
Использование выражения " Украсить-Сортировать-Украсить "
Это также известно как Schwartzian_transform после Р. Шварца, который популяризировал эту модель в Perl в 90-х годах:
Обратите внимание, что в этом случае
Y
иX
сортируются и сравниваются лексикографически. То естьY
сравниваются первые элементы (из ); и если они одинаковы, тоX
сравниваются вторые элементы (из ) и так далее. Это может создать нестабильную выходные данные, если вы не включите исходные индексы списка для лексикографического порядка, чтобы сохранить дубликаты в их первоначальном порядке.Использование
operator
модуляЭто дает вам более прямой контроль над тем, как сортировать ввод, так что вы можете получить стабильность сортировки , просто указав конкретный ключ для сортировки. Смотрите больше примеров здесь .
источник