我有一个字符串,我想把它分成N个等份。
例如,假设我有一个长度为128的字符串,我想将其分成4个长度为32的块; 即前32个字符,然后是第二个32个字符,依此类推。
如何实现这个功能?
我有一个字符串,我想把它分成N个等份。
例如,假设我有一个长度为128的字符串,我想将其分成4个长度为32的块; 即前32个字符,然后是第二个32个字符,依此类推。
如何实现这个功能?
import textwrap
print(textwrap.wrap("123456789", 2))
#prints ['12', '34', '56', '78', '9']
注意:要小心空格等内容 - 这可能是你想要的,也可能不是。"""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.
"""
print
放在括号中。 - Safwan Samsudeen你可以使用一个简单的循环:
parts = [your_string[i:i+n] for i in range(0, len(your_string), n)]
将元素分组为长度为n的另一种常见方法:
>>> s = '1234567890'
>>> list(map(''.join, zip(*[iter(s)]*2)))
['12', '34', '56', '78', '90']
这个方法直接来自于zip()
的文档。
list
调用看起来是多余的;你为什么要添加它? - Air':'.join(map(''.join, zip(*[reversed(qn.split('.'))]*4)))
从ip6.arpa.
字符串进行转换。 - NiKiZe递归方式:
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
演示:
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']
chunk_size = len(my_string)/N
。my_string[i: i + chunk_size]
(然后逐步增加 i
),可以在for循环或列表推导式中使用。我喜欢迭代器!
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']
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
这段代码非常容易与任何可迭代对象一起使用(只需删除str.join
,并且在in_string
不是字符串类型时不返回累加器即可)。
# 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]]