2017-01-02 4 views
1

itertools.product은리스트의 모든 순열을 생성하는 것이 매우 편리하지만, 하나의리스트 그 목록의 요소는 한 번에 순열을 채울 수 있습니까? 의사에서리스트의 모든 순열을 생성하는 방법뿐만 아니라 모든 순열에서 한 번만 나타날 수있는 문자열을 추가하는 방법

:

from itertools import product 
product('ABC', repeat=1) + ['.', '%3A'] 
->A, B, C, .A, .B, .C, A., B., C., %3AA, %3AB, %3AC, A%3A, B%3A, C%3A 

나는 그것이 아닌 사소한 것 생각 하나는 순열 건물 알고리즘을 조정할해야합니다.

+0

때때로 당신이 고안 한 솔루션을 구현하는 방법을 묻는 대신 문제에 대해 질문하는 것이 더 쉽습니다을합니다 (X/Y [참조 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

답변

1

3 개의 시리즈가 있습니다. 원래 입력 문자열을 목록으로 표시 한 다음 앞에 추가하고 추가합니다. 지능형리스트와

from itertools import chain, product 

inputstring = 'ABC' 
extra = ['.', '%3A'] 
for combo in chain(inputstring, 
     product(extra, inputstring), product(inputstring, extra)): 
    combo = ''.join(combo) 
    print(combo) 

데모 : 그 세 별도로 생성

>>> from itertools import chain, product 
>>> inputstring = 'ABC' 
>>> extra = ['.', '%3A'] 
>>> [''.join(combo) for combo in chain(inputstring, product(extra, inputstring), product(inputstring, extra))] 
['A', 'B', 'C', '.A', '.B', '.C', '%3AA', '%3AB', '%3AC', 'A.', 'A%3A', 'B.', 'B%3A', 'C.', 'C%3A'] 
+0

내 의사 코드에서'repeat' 인수를 늘리면 어떻게 되나요? ig'AA, A % 3AA, .. ' – ChiseledAbs

+0

@ChiseledAbs : 골 포스트를 움직이지 마십시오. 값을 * inside *로 두는 것은'product'의 또 다른 반복입니다; 추가 문자 ('combo + (combo [0],) '를 두 배로하는 제네레이터 (표현식 또는 함수)에서'product (inputstring, extra)'를 래핑하십시오. –

+0

@ChiseledAbs : Paulo가 문제는 해결해야 할 문제에 대해 더 명확히해야하며 솔루션이라고 생각하는 것을 구현하는 방법이 아니라 문제에 대한 명확한 해결책을 제공하는 데 도움이됩니다. 당신이 아직 공통점에서 생각하지 못했던 더 많은 변형. –