6
\$\begingroup\$

I was asked to code a solution in Python in 15 mins. Print all possible word combinations for a given phone number. Numbers 0 and 1 will not be part of the phone number, the numbers can be repeated, phone numbers can be of any length. For example if the number is 245:

All combinations of 'ABC', 'GHI' and 'JKL" is: ['AGJ', 'AGK', 'AGL', 'AHJ', 'AHK', 'AHL', 'AIJ', 'AIK', 'AIL', 'BGJ', 'BGK', 'BGL', 'BHJ', 'BHK', 'BHL', 'BIJ', 'BIK', 'BIL', 'CGJ', 'CGK', 'CGL', 'CHJ', 'CHK', 'CHL', 'CIJ', 'CIK', 'CIL']

In 15 mins, all I could come up with was to combine 2 numbers at a time and then combine the result with the third number and so on.

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

def combo(phnum):
    if len(phnum) == 1: return list(numbs[phnum[0]])
    else: result = combo(phnum[:-1])
    return [(ch1+ch2) for ch1 in result for ch2 in numbs[phnum[-1]]]

After I going home, I checked out itertools and found out about product. Came up with the following one liner. Is there a better way to solve this problem?

from itertools import product
def combo(phnum):
    return [''.join(tup) for tup in list(product(*[numbs[ch] for ch in phnum]))]
\$\endgroup\$

1 Answer 1

5
\$\begingroup\$

Solution overall seems nice, although:

  • casting to list in list comprehension is not needed
  • product returns iterator, so you also may want to generate iterator if you mainly plan to iterate over possibilities
  • I'd strongly advice using better names. Characters in source code costs nothing and maintaining code afterwards is much easier

My attempt would be:

import itertools

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

def possible_words(phone_number):
    letters_to_combine = (letters_map[digit] for digit in phone_number)
    for letters_group in itertools.product(*letters_to_combine):
        yield ''.join(letters_group)

print list(possible_words("23567"))
\$\endgroup\$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.