Python:我有一个字符串和一个由不同长度的列表组成的列表,我想按组返回对应于列表的字母



假设我有一个5个字母长的字符串,比如'ABCDE'。我也有一个列表列表的不同方式来分割列表,如[[5],[4,1],[3,2],…[1,1,1,1,1]]。How可以返回拆分列表的所有不同方式,如下所示。我遇到的问题是建立一个索引数量不均匀的循环。

INPUT
'ABCDE', list_of_configurations
OUTPUT
['ABCDE']
['A', 'BCDE']
['AB', 'CDE']
...
...
['A', 'B', 'C', 'D', 'E']

最后注意,我希望它是动态的,因为它可以应用于5个字符或9个字符的字符串。我一直在努力解决这个问题,但我认为这超出了我目前的技术水平。

如果您想应用包含可能的字符串"切片"的列表的配置列表,这里有一种方法可以做到这一点-基本上,我们取一个切片并将字符串的其余部分传递给下一步:

s = 'ABCDE'
c = [[5], [4, 1], [3, 2], [1, 1, 1, 1, 1]]
for item in c:
    result = []
    s_copy = s
    for index in item:
        result.append(s_copy[:index])
        s_copy = s_copy[index:]
    print(result)

打印:

['ABCDE']
['ABCD', 'E']
['ABC', 'DE']
['A', 'B', 'C', 'D', 'E']

这是一个经典的暴力破解问题。您必须生成可以拆分字符串的所有选项。你可以把它分成两个字母,也可以不用。

对于长度为n的字符串有n - 1个位置可以分割

a b c d e
 ^ ^ ^ ^

因此,每个长度为n - 1的二进制数组(只有0(如果你不想在那个位置分割字符串)和1(如果你想在那个位置分割字符串)对应一个可能的分割选项。例如

[1, 0, 0, 0] <=> ['a', 'bcde']
[1, 0, 1, 0] <=> ['a', 'bc', 'de']

可以从每个数组生成拆分。因此,该问题等价于遍历所有可能的二进制数组。

你可以使用暴力递归,但这更容易通过从0到2 ^ (n - 1)的数字循环,并根据该数字的二进制表示生成数组。

说了这么多,这就是解决你问题的代码。

def gen_all_splits(s):
    result = []
    for i in range(2 ** (len(s) - 1)):
        split = bin(i).replace('0b', '')
        split = '0' * (len(s) - len(split)) + split
        current_string_split = ['']
        for j in range(len(split)):
            if split[j] == '0':
                current_string_split[-1] += s[j]
            else:
                current_string_split.append(s[j])
        result.append(current_string_split)
    return result
print(gen_all_splits('abcdef'))

注:感谢评论,我才意识到我回答了你的更广泛的问题。我将保留答案,但您可以使用与通过拆分配置生成字符串相关的部分:

        current_string_split = ['']
        for j in range(len(split)):
            if split[j] == '0':
                current_string_split[-1] += s[j]
            else:
                current_string_split.append(s[j])

前面的答案是正确的,但是Python允许我们以更紧凑的方式编写:

def my_split(string, config):
    return [string[sum(config[:i]):sum(config[:i+1])] for i in range(len(config))]

要获得所有配置的结果,只需要循环遍历给定的配置并调用my_split函数。

最新更新