Python получить все перестановки чисел - PullRequest
6 голосов
/ 13 января 2010

Я пытаюсь отобразить все возможные перестановки списка чисел, например, если у меня есть 334, я хочу получить:

3 3 4
3 4 3
4 3 3

Мне нужно сделать это для любого набора цифр длиной до 12 цифр.

Я уверен, что, возможно, довольно просто использовать что-то вроде itertools.combinsk, но я не совсем понимаю синтаксис.

ТИА Sam

Ответы [ 4 ]

27 голосов
/ 13 января 2010
>>> lst = [3, 3, 4]
>>> import itertools
>>> set(itertools.permutations(lst))
{(3, 4, 3), (3, 3, 4), (4, 3, 3)}
4 голосов
/ 13 января 2010

без itertools

def permute(LIST):
    length=len(LIST)
    if length <= 1:
        yield LIST
    else:
        for n in range(0,length):
             for end in permute( LIST[:n] + LIST[n+1:] ):
                 yield [ LIST[n] ] + end

for x in permute(["3","3","4"]):
    print x

выход

$ ./python.py
['3', '3', '4']
['3', '4', '3']
['3', '3', '4']
['3', '4', '3']
['4', '3', '3']
['4', '3', '3']
2 голосов
/ 13 января 2010

Вы хотите перестановки, а не комбинации. Смотрите: Как сгенерировать все перестановки списка в Python

>>> from itertools import permutations
>>> [a for a in permutations([3,3,4])]
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)]

Обратите внимание, что он переставляет две тройки (что математически правильно делать), но не совпадает с вашим примером Это будет иметь значение только в том случае, если в вашем списке есть повторяющиеся номера.

1 голос
/ 06 января 2014

Я бы использовал Python itertools, но если бы вам пришлось реализовать это самостоятельно, вот код, который возвращает все перестановки указанного размера для списка значений.

Пример: values = [1,2,3], size = 2 => [[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]

def permutate(values, size):
  return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size))

def permutate_positions(n, size):
  if (n==1):
    return [[n]]

  unique = []
  for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]):
    if p not in unique:
      unique.append(p)

  return unique
...