我有一串整数,如'32102739'和字典,如{32:'a','739':'b','102':'c'}。鉴于该字符串,我想返回输出字符串'acb'。
我正在尝试
def change(string_, letters, length=1):
if string_[:length] in letters:
return letters[string_[:length]]
else:
return change(string_, letters, length+1)
我在查找第一个字母时遇到问题,然后继续检查下一个字母。
答案 0 :(得分:0)
假设没有歧义(并且数字不重叠),可以继续:
s = '32102739'
d = {'32': 'a', '739': 'b', '102': 'c'}
ret = ''
#start at the beginning of the string
pos, N = 0, len(s)
while pos < N:
#start at the current position pos and keep
#adding characters until a match is found
found = False
for i in range(pos+1, N+1):
#t = int(s[pos:i])
t = s[pos:i]
if t in d:
ret += d[t]
found = True
break
#if no match is found, signal an "invalid" input
if not found: raise ValueError
#update current position in the string
pos = i
print(ret) #gives 'acb'
答案 1 :(得分:0)
您的代码可以只进行一些小的调整(至少,它适用于非重叠的字典键)。您只需要更改成功的匹配大小写,以便在翻译前缀后对字符串的其余部分进行递归。您还需要添加一个基本案例,以便在匹配失败时停止递归,或者没有任何内容可以匹配。
def change(string_, letters, length=1):
if len(string_) < length: # base case
return "" # you might want to test if string_ is empty and if not, raise an exception
elif string_[:length] in letters:
return letters[string_[:length]] + change(string_[length:], letters) # add recursion
else:
return change(string_, letters, length+1)
我最后会注意到递归在Python中并不像在其他语言中那样高效。您可以重构您的函数以使用迭代而不是递归,它可能会更有效并且“Pythonic”。 ewcz's answer是这种重组的一个很好的例子。