一位同事给了我这个问题:
鉴于:'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
我想知道解决这个问题的更好方法。
答案 0 :(得分:1)
以K. Weston和bigballer的答案为基础,这就是我要做的。
递归输入的排列以获得可能的输出
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
由于这是一个生成器函数,你可以像这样使用它:
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']]