2013-02-18 4 views
0
I은 ​​예를 들면 ... 전화의 수열을 나타내는 문자의 모든 가능한 조합을 생성 할

: 항목이 '423'이면을 출력 같아야파이썬 재귀

GAD GAE GAF GBD GBE GBF GCD GCE GCF  
HAD HAE HAF HBD HBE HBF HCD HCE HCF 
IAD IAE IAF IBD IBE IBF ICD ICE ICF 

I

dic = {'2' : 'ABC', '3' : 'DEF', '4' : 'GHI', '5' : 'JKL', '6' : 'MNO', '7' : 'PQRS',  '8' : 'TUV', '9' : 'WXYZ'} 

하지만 여기에 재귀를 사용할 수있는 방법을 모르겠다는 ... 누군가가 도움을 줄 수 :이 문제를 해결하기 위해 재귀를 사용해야합니다 ... 나는이 같은 사전을 사용하기 시작? 난 당신이 itertools.product을 찾고 생각

def telephoneSequence(str): 
    for i in range (len(str)): 
     return dic[str[i]] 
+1

시작 – StoryTeller

+9

스택 오버플로에 오신 것을 환영합니다! 우리가 당신을 위해 몇 가지 코드를 작성하기를 원하는 것처럼 보입니다. 대부분의 사용자는 곤경에 처한 코더 코드를 기꺼이 만들지 만 일반적으로 포스터가 이미 문제를 해결하려고 시도했을 때만 도움이됩니다. 이러한 노력을 입증하는 좋은 방법은 지금까지 작성한 코드, 예제 입력 (있는 경우), 예상 출력 및 실제로 얻은 출력 (콘솔 출력, 스택 추적, 컴파일러 오류 등)을 포함시키는 것입니다. 응용할 수 있는). 더 자세하게 제공할수록 더 많은 답변을받을 수 있습니다. –

+1

@ user2083363, 의견에 코드를 게시하지 마십시오. 질문을 편집하고 코드를 추가하십시오. – StoryTeller

답변

10

:

내가 함께 이런 일을 시작할 생각

>>> import itertools 
>>> list(itertools.product('GHI','ABC','DEF')) 
[('G', 'A', 'D'), ('G', 'A', 'E'), ('G', 'A', 'F'), ('G', 'B', 'D'), ('G', 'B', 'E'), ('G', 'B', 'F'), ('G', 'C', 'D'), ('G', 'C', 'E'), ('G', 'C', 'F'), ('H', 'A', 'D'), ('H', 'A', 'E'), ('H', 'A', 'F'), ('H', 'B', 'D'), ('H', 'B', 'E'), ('H', 'B', 'F'), ('H', 'C', 'D'), ('H', 'C', 'E'), ('H', 'C', 'F'), ('I', 'A', 'D'), ('I', 'A', 'E'), ('I', 'A', 'F'), ('I', 'B', 'D'), ('I', 'B', 'E'), ('I', 'B', 'F'), ('I', 'C', 'D'), ('I', 'C', 'E'), ('I', 'C', 'F')] 

이 당신에게 튜플의 무리를 제공하지만, 당신은 쉽게 ''.join 수 있습니다 . 물론

>>> list(''.join(p) for p in itertools.product('GHI','ABC','DEF')) 
['GAD', 'GAE', 'GAF', 'GBD', 'GBE', 'GBF', 'GCD', 'GCE', 'GCF', 'HAD', 'HAE', 'HAF', 'HBD', 'HBE', 'HBF', 'HCD', 'HCE', 'HCF', 'IAD', 'IAE', 'IAF', 'IBD', 'IBE', 'IBF', 'ICD', 'ICE', 'ICF'] 

,이 순환하지 않고 다른 제약 힘이 있다면 당신을 도움이되지 않습니다 (아마도 교수?). 파이썬 표준 라이브러리가 얼마나 강력한지를 보여주고 재귀가 실제로 이런 종류의 문제 (적어도 파이썬에서는 아님)를위한 최선의 도구가 아니라는 것을 보여주기 위해이 대답을 남깁니다. 당신이 itertools.product를 사용하여 재귀를 구현하지 않으려는 경우

+0

그건 민감 할 수 있습니다. 솔루션,하지만 OP는 그가 재귀를 사용해야합니다 ... –

+0

아, 맞아. 재귀 부분을 놓친 ...아마도이 제한이없는 사람에게 유용 할 수 있습니다. – mgilson

+0

또는 그의 결과를 확인하는 것이 정확합니다. – MatthieuW

4

, 당신은 같은 것을 할 수 있습니다 : 다음

d = { 
    '0': "0", 
    '1': "1", 
    '2': "ABC", 
    '3': "DEF", 
    '4': "GHI", 
    '5': "JKL", 
    '6': "MNO", 
    '7': "PQRS", 
    '8': "TUV", 
    '9': "WXYZ", 
} 

def permutatePhoneNum(number): 
    result = [] 
    if len(number) == 1: 
     return [i for i in d[number]] 
    restPerm = permutatePhoneNum(number[1:]) 
    for chr in d[number[0]]: 
     for rest in restPerm: 
      result.append(chr + rest) 
    return result 

를, 당신은 다음과 같이 사용할 수 있습니다 :

>>> permutatePhoneNum("423") 
['GAD', 'GAE', 'GAF', 'GBD', 'GBE', 'GBF', 'GCD', 'GCE', 'GCF', 'HAD', 'HAE', 
'HAF', 'HBD', 'HBE', 'HBF', 'HCD', 'HCE', 'HCF', 'IAD', 'IAE', 'IAF', 'IBD', 
'IBE', 'IBF', 'ICD', 'ICE', 'ICF'] 
0

존재를하는 재귀를 사용하는 것으로 만 제한된 것은 내가 기대했던 것보다 낫다는 것이 더 까다 롭다. 파이썬에는 그런 일을 쉽게 처리 할 수있는 몇 가지 유용한 내장 기능이 있기 때문에 다소 실용적이지 못하다. 그러나, FWIW는 여기있다 :

KEYPAD = { 
    '0': '0', '1': '1', '2': 'ABC', '3': 'DEF', '4': 'GHI', 
    '5': 'JKL', '6': 'MNO', '7': 'PQRS', '8': 'TUV', '9': 'WXYZ', 
} 

def teleseq(digits, letters=[], result=None): 
    if result is None: result = [] 
    if len(digits) == 1: 
     result.extend(''.join(letters+[letter]) for letter in KEYPAD[digits[0]]) 
    else: 
     for letter in KEYPAD[digits[0]]: 
      teleseq(digits[1:], letters+[letter], result) 
    return result 

print sorted(teleseq('432')) 

출력 : 길이 1의 항목이 길이 2의 법적 엔트리로 전환 할 수있는 방법을 스스로에게 물어보다 길이 1의 항목을 생성와

['GDA', 'GDB', 'GDC', 'GEA', 'GEB', 'GEC', 'GFA', 'GFB', 'GFC', 'HDA', 'HDB', 
'HDC', 'HEA', 'HEB', 'HEC', 'HFA', 'HFB', 'HFC', 'IDA', 'IDB', 'IDC', 'IEA', 
'IEB', 'IEC', 'IFA', 'IFB', 'IFC']