将整数映射到字母表并基于3位输入打印所有组合

时间:2016-12-20 02:50:35

标签: python

一位同事给了我这个问题:

鉴于:'1'匹配'a','2'匹配'b','3'匹配'c'......就像明智......'26'到'z'。

如何获得遵循此模式的输出: 如果输入d =“111”,输出应为:aaa,ak,ka /(111) - > aaa,(1,11) - > ak,(11,1) - > ka

我创建了以下脚本,但我知道它太长了。

str1 = ""
str2=""
str3=""
d = "101"

for i in d:
    if "0" in i:
        pass
    else:
        str1 += chr(int(i)+96)

if int(d[0]) == 1:
    str2 += chr(int(d[0]+d[1])+96)
    str2 += chr(int(d[2])+ 96)
elif int(d[0]) == 2 and int(d[1]) < 7 :
    str2 += chr(int(d[0] + d[1]) + 96)
    str2 += chr(int(d[2]) + 96)
if int(d[1]) == 1:
    str3 += chr(int(d[0])+ 96)
    str3 += chr(int(d[1]+d[2])+96)
elif int(d[0]) == 2 and int(d[1]) < 7 :
    str3 += chr(int(d[1] + d[2]) + 96)
    str3 += chr(int(d[0]) + 96)


print str1
print str2
print str3

我想知道解决这个问题的更好方法。

3 个答案:

答案 0 :(得分:1)

以K. Weston和bigballer的答案为基础,这就是我要做的。

  1. 创建一个将数字映射到字母的字典
  2. 递归输入的排列以获得可能的输出

    letters = 'abcdefghijklmnopqrstuvwxyz'
    values = {
        i + 1: x for i, x in enumerate(letters)
    }
    
    def permutations(st):
        # we only need 1, 2 here because letter values are always less than one digit
        # don't worry about the '01' corner case since it wasn't defined in the problem, but easy to avoid with an extra if
        for x in range(1, 3):
            value = st[:x]
            # avoid yielding the same substring twice for 1-character st
            if len(val) < x: continue
            next_ = st[x:]
            value = int(value)
            # make sure our value maps to a letter
            # in 'a'..'z'
            value = values.get(value)
            if value is not None:
                if next_:
                    for y in permutations(next_):
                        yield value + y
                else:
                    yield value
    
  3. 由于这是一个生成器函数,你可以像这样使用它:

    for x in permutations('111'):
        print x
    

答案 1 :(得分:0)

你可以使用字典:

字典就像一个数组,但它有键值对。

例如:

alphabet = {1 : 'a', 2: 'b', 3: 'c'}
print alphabet[1]
>a

在你的情况下:

print alphabet[int(i)]

如果我是3则打印'c'。

希望有所帮助

答案 2 :(得分:0)

编辑,我完成了为你编码,诀窍是因为字母表很小,我们可以强制生成每个字母组合并将它们存储在查找表中:

from itertools import product
from string import lowercase
from collections import defaultdict
d = defaultdict(list)
for r in (2, 3):
    for p in product(lowercase,repeat=r):
         p = list(p)
         d[''.join(map(str,(ord(i) - ord('a') + 1 for i in p)))].append(p)

print d['111']
#[['a', 'k'], ['k', 'a'], ['a', 'a', 'a']]

print d['126']
#[['a', 'z'], ['l', 'f'], ['a', 'b', 'f']]