假设我有一个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函数。