Python 使用列表理解将字符串拆分为K个子字符串

Python 使用列表理解将字符串拆分为K个子字符串,python,Python,我有一根长长的绳子,就像这样 s='abcdabcdefghi' 我想将其拆分为K个子字符串,其中每个子字符串的长度必须至少为1,即非空。我想要所有这些可能的组合 如果K为3,则我期望的输出必须如下所示 [['abcda', 'bcdabcdabcda', 'bcdefghi'], [.....], [....], ... ] 我想用列表理解来做这件事,但我被卡住了。有可能实施吗。?还有其他更快的替代方案吗?使用,您可以获得分离索引对: >>> s = 'abcdef' &g

我有一根长长的绳子,就像这样

s='abcdabcdefghi'

我想将其拆分为K个子字符串,其中每个子字符串的长度必须至少为1,即非空。我想要所有这些可能的组合

如果
K
为3,则我期望的输出必须如下所示

[['abcda', 'bcdabcdabcda', 'bcdefghi'], [.....], [....], ... ]
我想用列表理解来做这件事,但我被卡住了。有可能实施吗。?还有其他更快的替代方案吗?

使用,您可以获得分离索引对:

>>> s = 'abcdef'
>>> k = 3
>>> list(combinations(range(1, len(s)), k-1))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
使用该索引对获取字符串片段

  • (1,2)
    ->(
    s[:1]
    s[1:2]
    s[2:
  • (1,3)
    ->(
    s[:1]
    s[1:3]
    s[3:
  • (4,5)
    ->(
    s[:4]
    s[4:5]
    s[5:

  • s[:1]==s[0:1]==s[None:1]
  • s[2:][=s[2:len(s)]==s[2:None]

您可以找到列表中的所有切片,这样,如果没有任何扩展库,切片部分都不会为空,例如:

s = 'abcd'
substrings = []

# find slice of first part - from a|bcd to ab|cd
for first_slice in range(len(s)-2):
    # find slice of second and last part, for bcd - from b|cd to bc|d
    #                                     for cd -  just c|d
    for second_slice in range(first_slice+1, len(s)-1):
        substrings.append([s[:first_slice+1], s[first_slice+1: second_slice+1], s[second_slice+1:]])

print(substrings) # -> [['a', 'b', 'cd'], ['a', 'bc', 'd'], ['ab', 'c', 'd']]

s = 'abcdabcdabcdabcdabcdefghi'
print(len(substrings)) # -> 276

为什么K=3的预期输出不是以
['a','b','cdabcdcdefghi']
开头?我只是给出了一个随机样本。顺序不重要你想要所有可能的
K
子列表组合吗?我想要所有可能的K个子列表组合。我正在寻找一些更快的方法。最好是列表理解。@SreeramTP,据我所知,时间复杂度是一样的。但其他解决方案(Filip Młynarski)仅适用于k=3的情况。若要继续,您需要为循环添加另一个
s = 'abcd'
substrings = []

# find slice of first part - from a|bcd to ab|cd
for first_slice in range(len(s)-2):
    # find slice of second and last part, for bcd - from b|cd to bc|d
    #                                     for cd -  just c|d
    for second_slice in range(first_slice+1, len(s)-1):
        substrings.append([s[:first_slice+1], s[first_slice+1: second_slice+1], s[second_slice+1:]])

print(substrings) # -> [['a', 'b', 'cd'], ['a', 'bc', 'd'], ['ab', 'c', 'd']]

s = 'abcdabcdabcdabcdabcdefghi'
print(len(substrings)) # -> 276