繁体   English   中英

如何在 Python 中使用递归拆分字符串?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM