我正在尝试编写一个程序,该程序将字符串(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含义"。任何形式的帮助都表示赞赏。
答案 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))