在 python 中不使用循环使用递归拆分字符串
Splitting a string with recursion using no loops in python
所以我想弄清楚这个问题,它要求我拆分一个字符串和 returns 拆分字符串的元组,这应该是递归完成的,绝对没有使用循环。
这是我想出的功能:
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 个元素。
那么我究竟应该如何解开内部元素,才能使最终元组成为 1 维元组而不是我拥有的 5 维元组?
递归时将append
更改为extend
。因为你 return 一个列表,你想扩展你现有的列表,而不是附加另一个内部列表。
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))
关于给定程序的最小修复,现有答案是正确的。但是,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更具迭代性的习惯用法。
这是一个替代版本,它在递归风格上更多一些:
def split_rec(path):
i = path.find('/')
if i == -1:
return (path,)
else:
return (path[:i],) + split_rec(path[i+1:])
这也是 return 一个实际的元组,如在问题的文本中,而不是在代码中的列表。要使其 return 成为一个列表,请将 (something,)
两次出现都替换为 [something]
。
所以我想弄清楚这个问题,它要求我拆分一个字符串和 returns 拆分字符串的元组,这应该是递归完成的,绝对没有使用循环。 这是我想出的功能:
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 个元素。
那么我究竟应该如何解开内部元素,才能使最终元组成为 1 维元组而不是我拥有的 5 维元组?
递归时将append
更改为extend
。因为你 return 一个列表,你想扩展你现有的列表,而不是附加另一个内部列表。
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))
关于给定程序的最小修复,现有答案是正确的。但是,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更具迭代性的习惯用法。
这是一个替代版本,它在递归风格上更多一些:
def split_rec(path):
i = path.find('/')
if i == -1:
return (path,)
else:
return (path[:i],) + split_rec(path[i+1:])
这也是 return 一个实际的元组,如在问题的文本中,而不是在代码中的列表。要使其 return 成为一个列表,请将 (something,)
两次出现都替换为 [something]
。