簡體   English   中英

使用列表理解將字符串拆分為K個子字符串

[英]Split a string to K substrings using List Comprehension

我這樣子很長

s = 'abcdabcdabcdabcdabcdefghi'

我想將其拆分為K個子字符串,其中每個子字符串的長度必須至少為1,即非空。 我想要所有可能的組合。

如果K為3,我期望的輸出必須如下所示

[['abcda', 'bcdabcdabcda', 'bcdefghi'], [.....], [....], ... ]

我想通過列表理解來做到這一點,但我陷入了困境。 有可能實現嗎? 還有其他更快的選擇嗎?

使用itertools.combinations ,可以獲得分離索引對:

>>> 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:]

>>> from itertools import combinations
>>> s = 'abcdef'

>>> k = 3
>>> [[s[i:j] for i, j in zip((None,) + idxs, idxs + (None,))]
...  for idxs in combinations(range(1, len(s)), k-1)]
[['a', 'b', 'cdef'], ['a', 'bc', 'def'], ..., ['abcd', 'e', 'f']]


>>> k = 4
>>> [[s[i:j] for i, j in zip((None,) + idxs, idxs + (None,))]
...  for idxs in combinations(range(1, len(s)), k-1)]
[['a', 'b', 'c', 'def'], ['a', 'b', 'cd', 'ef'], ..., ['abc', 'd', 'e', 'f']]
  • 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM