将字符串拆分为N个相等的部分?

Mo.*_*Mo. 30 python

我有一个字符串我想分成N个相等的部分.

例如,假设我有一个长度为128的字符串,我想将其分成4个长度为32的块; 即,前32个字符,然后是第二个32,依此类推.

我怎样才能做到这一点?

rob*_*ing 44

import textwrap
print textwrap.wrap("123456789", 2)
#prints ['12', '34', '56', '78', '9']
Run Code Online (Sandbox Code Playgroud)

注意:小心空白等 - 这可能是也可能不是你想要的.

"""Wrap a single paragraph of text, returning a list of wrapped lines.

    Reformat the single paragraph in 'text' so it fits in lines of no
    more than 'width' columns, and return a list of wrapped lines.  By
    default, tabs in 'text' are expanded with string.expandtabs(), and
    all other whitespace characters (including newline) are converted to
    space.  See TextWrapper class for available keyword args to customize
    wrapping behaviour.
    """
Run Code Online (Sandbox Code Playgroud)


Tim*_*ann 30

你可以使用一个简单的循环:

parts = [your_string[i:i+n] for i in range(0, len(your_string), n)]
Run Code Online (Sandbox Code Playgroud)


Ale*_*ton 15

将元素分组为n长度组的另一种常用方法:

>>> s = '1234567890'
>>> list(map(''.join, zip(*[iter(s)]*2)))
['12', '34', '56', '78', '90']
Run Code Online (Sandbox Code Playgroud)

这个方法直接来自docs zip().

  • 请注意_"返回的列表的长度被截断为最短参数序列的长度"_所以如果数据系列不能适合n-length的相等组,则任何额外的将被保留. (3认同)
  • 这比我的好多了!介意我偷这个以备将来使用吗?:) (2认同)

Ada*_*ith 6

我喜欢迭代器!

def chunk(in_string,num_chunks):
    chunk_size = len(in_string)//num_chunks
    if len(in_string) % num_chunks: chunk_size += 1
    iterator = iter(in_string)
    for _ in range(num_chunks):
        accumulator = list()
        for _ in range(chunk_size):
            try: accumulator.append(next(iterator))
            except StopIteration: break
        yield ''.join(accumulator)

## DEMO
>>> string = "a"*32+"b"*32+"c"*32+"d"*32
>>> list(chunk(string,4))
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccccccccccccccc', 'dddddddddddddddddddddddddddddddd']
>>> string += "e" # so it's not evenly divisible
>>> list(chunk(string,4))
['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcc', 'ccccccccccccccccccccccccccccccddd', 'ddddddddddddddddddddddddddddde']
Run Code Online (Sandbox Code Playgroud)

也明显比 快textwrap.wrap,虽然几乎可以肯定不那么“好”

>>> timeit.timeit(lambda: list(chunk(string,4)),number=500)
0.047726927170444355
>>> timeit.timeit(lambda: textwrap.wrap(string,len(string)//4),number=500)
0.20812756575945457
Run Code Online (Sandbox Code Playgroud)

并且很容易破解以使用任何可迭代对象(只需删除str.join和 yield 累加器,除非isinstance(in_string,str)

# after a petty hack
>>> list(chunk([1,2,3,4,5,6,7,8,9,10,11,12],4))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
Run Code Online (Sandbox Code Playgroud)


rob*_*ing 5

在许多情况下,您可以像对待列表一样对待字符串。这里有很多答案:Splitting a list of into N 个部分的长度大致相等

例如你可以计算出 chunk_size = len(my_string)/N

然后访问一个块,你可以去my_string[i: i + chunk_size](然后i通过 chunk_size递增) - 无论是在 for 循环中还是在列表理解中。


Omi*_*aha 5

递归方式:

def split_str(seq, chunk, skip_tail=False):
    lst = []
    if chunk <= len(seq):
        lst.extend([seq[:chunk]])
        lst.extend(split_str(seq[chunk:], chunk, skip_tail))
    elif not skip_tail and seq:
        lst.extend([seq])
    return lst
Run Code Online (Sandbox Code Playgroud)

演示:

seq = "123456789abcdefghij"

print(split_str(seq, 3))
print(split_str(seq, 3, skip_tail=True))

# ['123', '456', '789', 'abc', 'def', 'ghi', 'j']
# ['123', '456', '789', 'abc', 'def', 'ghi']
Run Code Online (Sandbox Code Playgroud)