문제

예를 들어 334가 있는 경우 다음과 같이 숫자 목록의 가능한 모든 순열을 표시하려고 합니다.

3 3 4
3 4 3
4 3 3

최대 12자리 길이의 모든 숫자 집합에 대해 이 작업을 수행할 수 있어야 합니다.

itertools.combinations와 같은 것을 사용하면 상당히 간단할 것이라고 확신하지만 구문을 제대로 이해할 수는 없습니다.

티아 샘

도움이 되었습니까?

해결책

>>> lst = [3, 3, 4]
>>> import itertools
>>> set(itertools.permutations(lst))
{(3, 4, 3), (3, 3, 4), (4, 3, 3)}

다른 팁

itertool 없이

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']

조합이 아닌 순열을 원합니다.보다: 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)]

두 개의 3을 바꾸는 것(수학적으로 올바른 일)이지만 귀하의 예와 동일하지는 않습니다.목록에 중복된 번호가 있는 경우에만 차이가 있습니다.

나는 파이썬을 사용할 것이다 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top