#python #python-3.x
#python #python-3.x
Вопрос:
Если мне предоставлен список чисел от 1 до N, как мне найти следующую перестановку данного списка?
Например:
lst = [2, 1, 4, 3]
следующая перестановка будет
[2, 3, 1, 4]
Что я сделал, так это использовал intertools
import itertools
lst2 = list(itertools.permutations([1, 2, 3, 4]))
затем найдите индекс данного списка и верните 1 этому индексу
Однако есть ли другой способ сделать это без использования intertools? Я думал, что есть шаблон того, как эти списки расположены в порядке возрастания.
Комментарии:
1. Перестановки являются случайными, если вы не определяете правило, по которому позиционируется любой новый элемент последовательности, поэтому
next
с точки зрения легитимности его нет.2. Как вы думаете, почему
[2, 3, 1, 4]
следующая после[2, 1, 4, 3]
?3. Предполагая, что перестановки генерируются алгоритмом
perm
, вы всегда можете просто сделать что-то вродеnext(islice(perm([2, 1, 4, 3]), 1, 2))
получения следующей перестановки в последовательности перестановок, котораяperm
будет генерироваться достаточно эффективно. Предположение здесь заключается в том, чтоperm
выдает итератор. Другой вариант — просто перетасовать список.4. Я хочу, чтобы они были в порядке последовательности intertools.permutations. Например: перестановка (1,2,3) будет указана в этом порядке: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)] . итак, если мне дано (2, 3, 1), я должен иметь возможность вернуть (3, 2, 1)
5. Проблема называется «следующая лексикографическая перестановка», для нее существует простой алгоритм, который можно найти путем поиска.