使用bru在python3中查找字符串中的所有子字符串

2024-04-19 04:49:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用bruteforce找到L = ['C', 'A', 'B', 'A', 'A', 'X', 'B', 'Y', 'A']中的所有子字符串'A' to 'B',这就是我所做的:

def find_substring(L):
    t = 0
    s = []
    for i in range(len(L) - 1):
        l = []
        if ord(L[i]) == 65:
            for j in range(i, len(L)):
                l.append(L[j])
                if ord(L[j]) == 66:
                    t = t + 1
                    s.append(l)
    return s, t

现在我需要输出:

^{pr2}$

但我得到:

[['A','B','A','A','X','B','Y','A'],['A','B','A','A','X','B','Y','A'],['A','A','X','B','Y','A'],['A','X','B','Y','A']]

有人能告诉我我做错了什么吗?在


Tags: to字符串inforlenreturnifdef
3条回答

问题是列表s包含对l列表的引用。在

因此,即使您要将正确的l列表附加到s之后,这些列表也会随着j循环的未来迭代修改l列表而更改。在

您可以通过附加l列表的副本来解决此问题:l[:]。在

此外,您可以直接比较字符串,无需转换为ASCII。在

def find_substring(L):
    s = []
    for i in range(len(L) - 1):
        l = []
        if L[i] == 'A':
            for j in range(i, len(L)):
                l.append(L[j])
                if L[j] == 'B':
                    s.append(l[:])
    return s

它现在起作用了:

^{pr2}$

最好先找到'A'和{}的所有索引,然后迭代这些索引,避免使用暴力。在

def find_substrings(lst)
    idx_A = [i for i, c in enumerate(lst) if c == 'A']
    idx_B = [i for i, c in enumerate(lst) if c == 'B']

    return [lst[i:j+1] for i in idx_A for j in idx_B if j > i]

当您将l附加到s时,您正在向一个列表添加一个引用,然后该列表将继续增长。您希望在附加时附加l列表内容的副本,以使其保持静态。在

           s.append(l[:])

这是一个常见的常见问题解答;这个问题可能应该作为一个副本来结束。在

相关问题 更多 >