在python中使用无循环递归拆分字符串
所以我试图解决这个问题,它要求我拆分一个字符串并返回一个拆分字符串的元组,这应该通过递归完成,绝对不使用循环。 这是我设法想出的函数:在python中使用无循环递归拆分字符串,python,string,python-3.x,recursion,tuples,Python,String,Python 3.x,Recursion,Tuples,所以我试图解决这个问题,它要求我拆分一个字符串并返回一个拆分字符串的元组,这应该通过递归完成,绝对不使用循环。 这是我设法想出的函数: def split_path(s): tup=[] i=s.find("/") if i!=-1: tup.append(s[0:i]) new_str=s[i+1:] tup.append(split_path(new_str)) else: tup.appe
def split_path(s):
tup=[]
i=s.find("/")
if i!=-1:
tup.append(s[0:i])
new_str=s[i+1:]
tup.append(split_path(new_str))
else:
tup.append(s)
return tup
“E:/cp104/2005/labs/lab11t4”是我输入函数的字符串,输出应该是:
['E:', 'cp104','2005','labs','lab11t4']
但这就是我所拥有的:
['E:', ['cp104', ['2005', ['labs', ['lab11t4']]]]]
现在我成功地得到了字符串中我需要的所有值,我知道问题是我返回了一个元组,所以它只是在元组中附加了一个元组,所以我的外部元组中只有2个元素
那么,如何准确地将内部元素解耦,从而使最终的元组为一维而不是我拥有的5维元组呢?在执行递归时,更改
追加到扩展。因为您返回了一个列表,所以您希望扩展当前的列表,而不是附加另一个内部列表
def split_path(s):
tup=[]
i=s.find("/")
if i!=-1:
tup.append(s[0:i])
new_str=s[i+1:]
tup.extend(split_path(new_str))
else:
tup.append(s)
return tup
split_path("E:/cp104/2005/labs/lab11t4")
['E:', 'cp104', '2005', 'labs', 'lab11t4']
执行递归时,将append
更改为extend
。因为您返回了一个列表,所以您希望扩展当前的列表,而不是附加另一个内部列表
def split_path(s):
tup=[]
i=s.find("/")
if i!=-1:
tup.append(s[0:i])
new_str=s[i+1:]
tup.extend(split_path(new_str))
else:
tup.append(s)
return tup
split_path("E:/cp104/2005/labs/lab11t4")
['E:', 'cp104', '2005', 'labs', 'lab11t4']
您可以使用extend
而不是append
:
tup.extend(split_path(new_str))
您可以使用extend
而不是append
:
tup.extend(split_path(new_str))
对于给定程序的最小修复,现有答案是正确的。然而,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更加迭代的习惯用法
下面是另一个版本,它更像是递归样式:
def split_rec(path):
i = path.find('/')
if i == -1:
return (path,)
else:
return (path[:i],) + split_rec(path[i+1:])
这还会返回一个实际的元组,如问题文本中的元组,而不是代码中的列表。要使它返回一个列表,请将(something,)
替换为[something]
。对于给定程序的最小修复,现有答案是正确的。然而,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更加迭代的习惯用法
下面是另一个版本,它更像是递归样式:
def split_rec(path):
i = path.find('/')
if i == -1:
return (path,)
else:
return (path[:i],) + split_rec(path[i+1:])
这还会返回一个实际的元组,如问题文本中的元组,而不是代码中的列表。要使其返回一个列表,请将出现的两次(something,)
替换为[something]
。对于python来说,这是一个多么糟糕的作业……对于python来说,这是一个多么糟糕的作业……您的算法建立了一个延迟操作链,这是一个递归过程,也是一个递归过程。其他的是迭代过程,但它们仍然是递归过程。您的算法建立了一个延迟操作链,这是一个递归过程,也是一个递归过程。其他的是迭代过程,但它们仍然是递归过程