将string分隔成第n个字符?
可能重复:
什么是在块中迭代列表的最“pythonic”方式?
是否有可能分裂一个pythonstring每个字符?
例如,假设我有一个包含以下内容的string:
'1234567890'
我怎样才能让它看起来像这样:
['12','34','56','78','90']
>>> line = '1234567890' >>> n = 2 >>> [line[i:i+n] for i in range(0, len(line), n)] ['12', '34', '56', '78', '90']
要完成,你可以用正则expression式来完成这个工作:
>>> import re >>> re.findall('..','1234567890') ['12', '34', '56', '78', '90']
正如在评论中指出的,你可以这样做:
>>> import re >>> re.findall('..?', '123456789') ['12', '34', '56', '78', '9']
您也可以执行以下操作来简化更长块的正则expression式:
>>> import re >>> re.findall('.{1,2}', '123456789') ['12', '34', '56', '78', '9']
如果string很长,则可以使用re.finditer
来按块生成块。
将元素分组为n个长度组的另一种常见方式是:
>>> s = '1234567890' >>> map(''.join, zip(*[iter(s)]*2)) ['12', '34', '56', '78', '90']
这个方法直接来自zip()
的文档。
我认为这比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))
我喜欢这个解决scheme:
s = '1234567890' o = [] while s: o.append(s[:2]) s = s[2:]
使用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']
这是我的解决scheme:
def split_every(n, s): return [ s[i:i+n] for i in xrange(0, len(s), n) ] print split_every(2, "1234567890")
使用itertools
。 本手册的“配方”部分提供了一个function来完成此操作:
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)
使用PyPI的more-itertools :
>>> from more_itertools import sliced >>> list(sliced('1234567890', 2)) ['12', '34', '56', '78', '90']
>>> from functools import reduce >>> from operator import add >>> from itertools import izip >>> x = iter('1234567890') >>> [reduce(add, tup) for tup in izip(x, x)] ['12', '34', '56', '78', '90'] >>> x = iter('1234567890') >>> [reduce(add, tup) for tup in izip(x, x, x)] ['123', '456', '789']
试试下面的代码:
from itertools import islice def split_every(n, iterable): i = iter(iterable) piece = list(islice(i, n)) while piece: yield piece piece = list(islice(i, n)) s = '1234567890' print list(split_every(2, list(s)))
一如往常,对于那些爱一个class轮的人来说
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])]
幽灵般的 – 试图发明另一个答案:
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))
退房
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] ['12', '34', '56', '78', '90'] ['123', '456', '789']
我有这个代码,只要我需要这样做:
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
是要拆分的string -
lst
是st
的列表版本 -
i
是目前正在使用的字符在st
-
l
是最后一个列表项的长度
这是另一种更一般情况下的解决scheme,其中块的长度不相等。 如果长度为0,则返回所有剩余部分。
data
是要拆分的序列; fieldsize
是一个具有字段长度列表的元组。
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);
我正在使用这个:
list(''.join(s) for s in zip(my_str[::2], my_str[1::2]))
或者您可以使用任何其他n
数字而不是2
。