2014-10-18 2 views
1

글자 수가 3 개와 2 개라고하고 가능한 모든 단어를 찾고 싶습니다. itertools.permutationsitertools.product을 시도했지만 도움이되지 않았습니다.여러개의 (가능한 반복되는) 글자를 사용하여 모든 고유 단어를 효율적으로 생성하는 방법

결과는 permutations에 반복됩니다 (즉, 동일한 단어가 여러 번 나타남). 예를 들어 '

> print [''.join(i) for i in itertools.product('ab', repeat=3)] 
['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb'] 

이 개 A의 나는`['AAB '를 얻으려면 하나의 b :

> print [''.join(i) for i in itertools.permutations('aab', 3)] 
['aab', 'aba', 'aab', 'aba', 'baa', 'baa'] 

2) product의 결과는 문자 하나에 단어를 포함 할 수 있습니다 aba ','baa ']. 또한 결과가 매우 커질 수 있기 때문에 이터레이터를 사용하고 목록을 사용하지 않는 방법 (또는 메모리에 모든 것을 저장하는 다른 방법)이 필요합니다.

+0

전체 결과는 매우 커질 수 있으므로 메모리에 저장됩니다. itertools 같은 것이 좋을 것입니다. – Elektito

+0

여기에서 발전기를 사용할 수 있습니다. http://stackoverflow.com/questions/6284396/permutations-with-unique-values/6285203#6285203 또는 http://stackoverflow.com/questions/12836385/how-can-i-interleave 12837695 # 12837695 –

+0

@LukaRahne 첫 번째 스택은 상대적으로 빠르게 소모되지만 두 번째 스택은 완벽 할 것으로 보인다. 고맙습니다. – Elektito

답변

-1

이 문제가 마음에 듭니다.

  1. 문자 목록을 복제되지 않은 문자로 분할합니다.
  2. itertools을 사용하여 중복되지 않은 문자의 고유 순열을 한 번에 하나씩 생성 할 수 있습니다.
  3. 복제 된 각 문자에 대해 한 번에 하나씩 문자를 삽입하는 방법을 생성 할 수 있습니다. (이것은 우리가 별개의 이러한 중복의 서로 다른 주문을 취급하지 않도록 별도로 수행해야합니다.)
2
def _permute(xs): 
    if not xs: 
     yield() 
    for x in xs: 
     xs[x] -= 1 
     if not xs[x]: 
      xs.pop(x) 
     for ys in _permute(xs): 
      yield (x,) + ys 
     xs[x] += 1 

from collections import Counter 
def permute(xs): 
    return _permute(Counter(xs)) 

사용법 : 나는이를 저장하지 않으 말했듯이

>>> list(permute('aab')) 
[('a', 'a', 'b'), ('a', 'b', 'a'), ('b', 'a', 'a')] 
>>> [''.join(xs) for xs in permute('aab')] 
['aab', 'aba', 'baa'] 
>>> map(''.join, permute('aab')) # list(map(...)) in Python 3.x 
['aab', 'aba', 'baa'] 
+0

고맙지 만'next (permute ('ab'* 1000))'는 "최대 재귀 깊이를 초과했습니다"라는 오류를줍니다. 이는 내 상황에 적합한 해결책이 아님을 의미합니다. – Elektito

+0

@Elektito, 당신은'sys.setrecursionlimit'을 사용하여 재귀 제한을 증가시킬 수 있습니다. 예를 들어,'import sys; sys.setrecursionlimit (3000)' – falsetru

+0

조금 더 커졌고 지금은 segfault가 생겼습니다. 게다가, 이것은 본질적으로 솔루션의 공간 복잡성을 변화시키지 않으며,이 많은 데이터를 저장하기위한 스택에 의존하는 것은 일반적으로 문제를 일으킬 수 있습니다. – Elektito

관련 문제