将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
  • lstst的列表版本
  • 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