我有一个字符串我想分成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().
我喜欢迭代器!
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)
在许多情况下,您可以像对待列表一样对待字符串。这里有很多答案:Splitting a list of into N 个部分的长度大致相等
例如你可以计算出 chunk_size = len(my_string)/N
然后访问一个块,你可以去my_string[i: i + chunk_size](然后i通过 chunk_size递增) - 无论是在 for 循环中还是在列表理解中。
递归方式:
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)
| 归档时间: |
|
| 查看次数: |
44318 次 |
| 最近记录: |