在Python中将整数与字母匹配

时间:2017-03-18 18:14:50

标签: python

我有一串整数,如'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)

我在查找第一个字母时遇到问题,然后继续检查下一个字母。

2 个答案:

答案 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是这种重组的一个很好的例子。