【问题标题】:Split a string into exactly N pieces将字符串拆分为 N 段
【发布时间】:2024-01-16 07:54:01
【问题描述】:

给定一个数字 N 和一个字符串,我需要将字符串分成 完全 N 个。

例如,如果 N=3

  • abcd -> ["ab", "c", "d"]
  • abcde -> ["ab", "cd", "e"]
  • abcdef -> ["ab", "cd", "ef"]
  • abcdefg -> ["abc", "de", "fg"]

实现这一目标的最佳方法是什么(最好在 python 中)?

我目前(效果不够好)的解决方案是

chunkSize = int(ceil(len(myString) / float(numOfChunks)))
chunks = [myString[i:i+chunkSize ] for i in range(0, len(myString), chunkSize )]

【问题讨论】:

  • 我不明白。我数了 3 件。
  • 为什么不完全可分时的具体分布,为什么不是['a', 'b', 'cd']['a', 'bc', 'de']['ab', 'cd', 'efg']
  • 对不起,我修好了。我的意思是 3。如果是 4,那么例如:abcde -> ["ab", "c", "d", "e"]
  • 分割的标准是什么?我的意思是,"abcd" 也可以拆分为 ["a", "b", "cd"] 或 ["a", "bc", "d"] 或其他?

标签: python string algorithm logic


【解决方案1】:

将输入序列分成偶数块的生成器:

def split_into(s, n):
    size, remainder = divmod(len(s), n)
    start = 0
    for i in range(n):
        length = size + (i < remainder)
        yield s[start:start + length]
        start += length

这利用了boolintTrue == 1 的子类这一事实。

演示:

>>> list(split_into('abcd', 3))
['ab', 'c', 'd']
>>> list(split_into('abcde', 3))
['ab', 'cd', 'e']
>>> list(split_into('abcdef', 3))
['ab', 'cd', 'ef']
>>> list(split_into('abcdefg', 3))
['abc', 'de', 'fg']
>>> list(split_into('abcdefgh', 3))
['abc', 'def', 'gh']

【讨论】:

  • 这与我的想法非常接近。我会试一试。谢谢!
  • 这是一个可爱的功能和答案,+1 :)
【解决方案2】:

这是伪代码。我不懂 Python,但可能作为通用算法有用。

RegLen <- Int(Len(Str)/N)   # The integer portion only
FirstLen = Len(Str) - N * RegLen
# Output goes into Output[] array of length N elements, each a substring

Output[1] = Left(Str, FirstLen)

For i <- 2 to N
   StartPosition <- FirstLen + (i-2) * RegLen + 1
   Output[i] <- Mid(Str, StartPosition, RegLen)
Loop

【讨论】: