[英]How do i split strings with recursion in Python?
我想问一下如何创建一个递归函数,该函数将列表中包含的每个字符串拆分为每个字符,每次重复该过程时从开头删除一个。 我也想这样做,但每次都从末尾删除一个字母。 例如,如果我有类似的东西:
list=['house','cat','dog']
我应该得到
['house','ouse','use','se','e','cat','at','t','dog','og','g']
和
['house','hous','hou','ho','h','cat','ca','c','dog','do','d']
我试图这样做,但它不起作用; 此外,它应该都是递归的......提前谢谢你。
def substring(stringslist):
final=[]
for string in stringslist:
if len(string)==1:
return final.append(string)
else:
return final.append(substring(string[::-1]))
使用生成器可以实现更直接的实现 - 您只需要将结果转换为list()
。
lst=['house','cat','dog']
def substring(string, reversed=False):
if string: # if string is not zero-length:
yield string # yield its full length
yield from substring(string[:-1] if reversed else string[1:]) # and recurse
def substrings(stringslist, reversed=False):
for string in stringslist:
yield from substring(string, reversed)
>>> list(substrings(lst))
['house', 'ouse', 'use', 'se', 'e', 'cat', 'at', 't', 'dog', 'og', 'g']
>>> list(substrings(lst, reversed=True))
['house', 'hous', 'ous', 'us', 's', 'cat', 'ca', 'a', 'dog', 'do', 'o']
如果您想要递归,这将完成工作。 我只为一种情况编写了它,但您可以轻松地将其翻转为其他情况。
def substring(stringslist):
final = []
for string in stringslist:
final.append(string)
if len(string)==1:
return final
else:
final.extend(substring([string[:-1]]))
return final
以下代码应该适合您:
list=['house','cat','dog']
final=[]
for word in list:
for i in range(len(word)):
final.append(word[i:])
print(final)
输出:['house', 'ouse', 'use', 'se', 'e', 'cat', 'at', 't', 'dog', 'og', 'g']
在这里,我遍历列表,对于列表中的每个单词,我再次遍历字母以确定要添加到最终列表中的项目数。
首先,让我们将您的函数修复为有效的迭代版本。
def substring(strings):
final = []
for string in strings:
while string:
final.append(string)
string = string[1:]
return final
接下来,让我们将final
变量移动到参数中,以便对函数的递归调用可以建立在列表上。
def substring(strings, final=None):
if final is None: final = []
for string in strings:
while string:
final.append(string)
string = string[1:]
return final
下一步是将for
循环转换为递归。 我们可以看到基本情况是列表strings
为空时,递归情况是对strings
每个元素进行处理。 对于这里的递归情况,我们将提取strings
的第一个元素并将列表的其余部分传递给递归调用。
def substring(strings, final=None):
if final is None: final = []
# base case: empty list
if not strings: return final
# recursive case:
# work on first string in list
string = strings[0]
# add all substrings to final
while string:
final.append(string)
string = string[1:]
return substring(strings[1:], final)
将while
循环转换为递归是一个类似的过程:找到基本情况(空string
)和递归情况(向final
添加单个子string
),并对递归情况进行递归调用。
def substring(strings, final=None):
if final is None: final = []
if not strings: return final
string = strings[0]
if not string: return substring(strings[1:], final)
final.append(string)
strings[0] = string[1:]
return substring(strings, final)
最后,进行一些清理。
def substring(strings, final=None):
if final is None: final = []
if not strings: return final
if not string[0]: return substring(strings[1:], final)
final.append(string)
strings[0] = string[0][1:]
return substring(strings, final)
为清楚起见,我使用了嵌套for
循环,但您可以使用列表理解来缩短代码。
使用 enumerate() 获取索引,以便您可以进行子字符串操作。
空闲输出:
>>> new_list1 = []
>>> new_list2 = []
>>> for item in my_list:
for index, value in enumerate(item):
new_list1.append(item[:len(item)-index])
new_list2.append(item[index:])
>>> new_list1
['house', 'hous', 'hou', 'ho', 'h', 'cat', 'ca', 'c', 'dog', 'do', 'd']
>>> new_list2
['house', 'ouse', 'use', 'se', 'e', 'cat', 'at', 't', 'dog', 'og', 'g']
这是对一个字符串进行递归的方法,我添加了一个 for 循环,您可以从中获得灵感:
L = ['house','cat','dog']
final = []
def substring(s):
global final
if len(s)==1:
final.append(s)
else:
final.append(s)
substring(s[:-1])
return final
for s in L:
substring(s)
print(final)
# ['house', 'hous', 'hou', 'ho', 'h', 'cat', 'ca', 'c', 'dog', 'do', 'd']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.