def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
8
我喜欢这个解决方案:
s = '1234567890'
o = []
while s:
o.append(s[:2])
s = s[2:]
-2
我知道这个问题已经过时了,但这是最简单的方法,我知道:
def split_every_n(S, n):
return [S[i*n:(i+1)*n] for i in range(len(S) / n)]
但是,这假设您的字符串的长度是n的倍数 . 否则,你必须填写它 .
19
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']
这就是包装的docstring所说的:
>>> help(wrap)
'''
Help on function wrap in module textwrap:
wrap(text, width=70, **kwargs)
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.
'''
18
我认为这比itertools版本更短,更易读:
def split_by_n( seq, n ):
"""A generator to divide a sequence into chunks of n units."""
while seq:
yield seq[:n]
seq = seq[n:]
print list(split_by_n("1234567890",2))
416
我有这个代码,我需要这样做时使用:
def split_string(n, st):
lst = [""]
for i in str(st):
l = len(lst) - 1
if len(lst[l]) < n:
lst[l] += i
else:
lst += [i]
return lst
print(split_string(3, "test_string."))
哪里:
n 是每个列表项的长度
st 是要拆分的字符串
lst 是 st 的列表版本
i 是 st 中使用的当前字符
l 是最后一个列表项的长度
-1
def split(s, n):
"""
Split string every nth character
Parameters
----------
s: string
n: value of nth
"""
new_list = []
for i in range(0, len(s), n):
new_list.append(s[i:i+n])
return new_list
print(split('1234567890', 2))
s = "1234567890"
["".join(c) for c in mit.grouper(2, s)]
["".join(c) for c in mit.chunked(s, 2)]
["".join(c) for c in mit.windowed(s, 2, step=2)]
["".join(c) for c in mit.split_after(s, lambda x: int(x) % 2 == 0)]
def fieldsplit(data=None, fieldsize=()):
tmpl=[];
for pp in fieldsize:
if(pp>0):
tmpl.append(line[:pp]);
line=line[pp:];
else:
tmpl.append(line);
break;
return tuple(tmpl);
3
一如往常,对于那些喜欢一个衬垫的人
n = 2
line = "this is a line split into n characters"
line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
20
我用这个:
list(''.join(s) for s in zip(my_str[::2], my_str[1::2]))
或者您可以使用任何其他 n 数字而不是 2 .
3
试试这个:
s='1234567890'
print([s[idx:idx+2] for idx,val in enumerate(s) if idx%2 == 0])
输出:
['12', '34', '56', '78', '90']
2
幽灵般的 - 试图发明另一个答案:
def split(s, chunk_size):
a = zip(*[s[i::chunk_size] for i in range(chunk_size)])
return [''.join(t) for t in a]
print(split('1234567890', 1))
print(split('1234567890', 2))
print(split('1234567890', 3))
def display(list):
for i in list: #To display the strings
print(i)
#Take a group of strings from keyboard
print('Enter strings separated by comma: ')
list = [x for x in input().split(",")]
#call display() and pass the list
display(list)
#output
karthik, siva, raman, inban
Enter strings separated by comma:
karthik
siva
raman
inban
163
使用lambda:
split_string = lambda x, n: [x[i:i+n] for i in range(0, len(x), n)]
s = '1234567890'
split_string(s,2)
['12', '34', '56', '78', '90']
6
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
6
要完成,你可以用正则表达式做到这一点:
>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
23 回答
使用itertools . 本手册的"Recipes"部分提供了完成此操作的功能:
我喜欢这个解决方案:
我知道这个问题已经过时了,但这是最简单的方法,我知道:
但是,这假设您的字符串的长度是n的倍数 . 否则,你必须填写它 .
这就是包装的docstring所说的:
我认为这比itertools版本更短,更易读:
我有这个代码,我需要这样做时使用:
哪里:
n
是每个列表项的长度st
是要拆分的字符串lst
是st
的列表版本i
是st
中使用的当前字符l
是最后一个列表项的长度将元素分组为n长度组的另一种常用方法:
此方法直接来自zip()的文档 .
more_itertools.sliced之前已经mentioned . 以下是more_itertools库中的另外四个选项:
后面的每个选项都会产生以下输出:
讨论选项的文档:grouper,chunked,windowed,split_after
短字符串的简单递归解决方案:
或者以这种形式:
,它更明确地说明了递归方法中典型的分而治之模式(尽管实际上没有必要这样做)
这是针对更一般情况的另一种解决方案,其中块的长度不相等 . 如果长度为0,则返回所有剩余部分 .
data
是要拆分的序列;fieldsize
是一个带有字段长度列表的元组 .一如往常,对于那些喜欢一个衬垫的人
我用这个:
list(''.join(s) for s in zip(my_str[::2], my_str[1::2]))
或者您可以使用任何其他
n
数字而不是2
.试试这个:
输出:
幽灵般的 - 试图发明另一个答案:
退房
请尝试以下代码:
这是我的解决方案:
使用PyPI中的more-itertools:
A显示一组字符串的函数
使用lambda:
要完成,你可以用正则表达式做到这一点:
正如评论中指出的那样,你可以这样做:
您还可以执行以下操作,以简化较长块的正则表达式:
如果字符串很长,你可以使用
re.finditer
来按块生成块 .