以递归方式从1中创建2个字符串

时间:2016-10-04 01:33:38

标签: python string tuples

我正在尝试编写一个程序,该程序将字符串(stringg)分开并创建1个字符串,其中stringg中包含全部大写字母,1个字符串中包含stringg中的所有小写字母。

结果应该是这样的:

split_rec('HsaIm') = ('HI', 'sam')

这就是我试图递归写的方式。

def split_rec(stringg):

    if not stringg: 
        return ('')
    elif stringg[0].isupper() == True and stringg[0].isalpha() == True:
        return stringg[0] + split_rec(stringg[1:]), split_rec(stringg[1:])
    elif stringg[0].isupper() == False and stringg[0].isalpha() == True:
        return split_rec(stringg[1:]), stringg[0] + split_rec(stringg[1:])

但是当我尝试时,我会收到错误代码"无法转换'元组'反对str含义"。任何形式的帮助都表示赞赏。

3 个答案:

答案 0 :(得分:1)

首先避免测试:

if condition == True:

并简单地写

if condition:

然后你需要返回一个元组并在所有情况下将结果作为元组访问:

def split_rec(stringg):

    if not stringg: 
        return ('','')
    else:
        first = stringg[0]
        assert first.isalpha(), "The string contains invalid characters."
        upper, lower = split_rec(stringg[1:])
        if first.isupper():
            return first + upper, lower
        else:
            return upper, first + lower

答案 1 :(得分:1)

split_rec = lambda x: tuple(map(''.join, zip(*[(a,'') if a.isupper() else ('',a) for a in x if a.isalpha()])))

>>> split_rec('HsaIm')
('HI', 'sam')

这会将您的字符串作为大写或小写分类,方法是将它放在元组的右侧或左侧。然后它解压缩元组(使用zip(*[...])),对每个元素应用join函数使它们重新成为字符串然后再将整个元素作为元组。

以防您需要单行解决方案

答案 2 :(得分:0)

递归逻辑存在问题,可以轻松完成,无需递归,如:

def split_rec(stringg):
    alphas = [x for x in stringg if x.isalpha()]
    lower = [x for x in alphas if not x.isupper() ]
    upper = [x for x in alphas if x.isupper() ]
    return (''.join(upper), ''.join(lower))