2010-11-26 3 views
2

웹상에서 재귀에 대한 정보가 꽤 있지만, 내 문제에 적용 할 수있는 것을 찾지 못했습니다. 나는 여전히 프로그래밍에 익숙하지 않으므로 제 질문이 사소한 것이라면 저를 용서해주십시오. 이것은 내가 함께 종료 할 것입니다Python : Recursion

: 도와위한

감사 :

listVariations(listOfItems, numberOfDigits) 

>>> listVariations(['a', 'b', 'c'], 1) 
>>> ['a', 'b', 'c'] 

>>> listVariations(['a', 'b', 'c'], 2) 
>>> ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc'] 

>>> listVariations(['a', 'b', 'c'], 3) 
>>> ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 

하지만 지금까지 내가 지정해야하는 기능과 함께 올 만 할 수 있었다/사전에 자릿수를 알아야합니다. 이 추악하고 잘못이 아마 매우 간단

list = ['a', 'b', 'c'] 

def listVariations1(list): 
    variations = [] 
    for i in list: 
    variations.append(i) 
    return variations 

def listVariations2(list): 
    variations = [] 
    for i in list: 
    for j in list: 
     variations.append(i+j) 
    return variations 

def listVariations3(list): 
    variations = [] 
    for i in list: 
    for j in list: 
     for k in list: 
     variations.append(i+j+k) 
    return variations 

oneDigitList = listVariations1(list) 
twoDigitList = listVariations2(list) 
threeDigitList = listVariations3(list) 

,하지만 난 함수가 자신을 호출 할 때 문자열을 연결하는 좋은 방법을 마련 할 수 없었다. 당신의 노력

감사합니다 :)

+3

당신은 정말 변수 이름으로'list'를 사용할 수 없습니다. 이것은 내장 된'list' 클래스의 생성자이고, 이렇게하면 그림자가 생깁니다. – aaronasterling

+0

포인트가 찍혔습니다 - 다시는 발생하지 않습니다 ... – TIM

답변

5

당신은 당신이 할 itertools.permutations을 사용할 수 있습니다 itertools

+4

'it (iterator.product (list_, repeat = 3))의 항목에 대한 list (''조인 (item)) ' – aaronasterling

+0

이것은 정확하게 달성하고자하는 것입니다. 고마워요 :) – TIM

0
from itertools import combinations_with_replacement 

이 기능은 정확히 당신이 원하는 않습니다.

+0

이것은 파이썬 3.1 이상에서만 작동합니다. 그리고 어쨌든 옳지 않습니다. Srinivas Reddy Thatiparth가 올바른 대답을했습니다. – aaronasterling

0

product() 기능을 사용할 수 있습니다. 당신은 재귀 함수 호출과 비슷한 구현하려는 경우

from itertools import permutations 

def listVariations(listOfItems, numberOfDigits): 
    return [''.join(x) for x in permutations(listOfItems, numberOfDigits)] 

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

def permute(seq, n): 
    for i in xrange(len(seq)): 
     head, tail = seq[i:i+1], seq[0:i]+seq[i+1:] 
     if n == 1: 
      yield head 
     else: 
      if tail: 
       for sub_seq in permute(tail, n-1): 
        yield head + sub_seq 
      else: 
       yield head 

a_list = ['a', 'b', 'c'] 
list(permute(''.join(a_list), 2)) 
a_str = 'abc' 
list(permute(a_str, 2))