2011-04-19 70 views
11

我正在使用Python为我工作的实验室编程。我怎样才能切出给定字符串中的每3个字符并将其附加到列表中?如何每3个索引切分一个字符串?

即XXXxxxXXXxxxXXXxxxXXXxxxXXX(其中X或X是任何给定的字母)

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX' 
mylist = [] 

for x in string: 
    string[?:?:?] 
    mylist.append(string) 

我想要列表看起来像这样: 'XXX', 'XXX', 'XXX', 'XXX',” XXX'.... etc]

任何想法?

+2

ah,codons =))) – ninjagecko 2011-04-19 04:08:37

+3

这非常类似于[在块中的列表中迭代](http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to - 在列表中细分) - 检查那里的答案以获得一些出色的方法。 – 2011-04-19 04:20:46

回答

19

总之,你不能。

在更长的时间,你需要编写自己的功能,可能是:

def split(str, num): 
    return [ str[start:start+num] for start in range(0, len(str), num) ] 

例如:

 
>>> split("xxxXXX", 3) 
['xxx', 'XXX'] 
>>> split("xxxXXXxx", 3) 
['xxx', 'XXX', 'xx'] 
4

据我所知,在方法没有内置,让你为每个x索引分块。然而,这应该工作:

str = "stringStringStringString" 

def chunk_str(str, chunk_size): 
    return [str[i:i+chunk_size] for i in range(0, len(str), chunk_size)] 

chunk_str(str,3) 

生产:分裂列表之间

['str', 'ing', 'Str', 'ing', 'Str', 'ing', 'Str', 'ing'] 
+0

甚至没有.split()方法? – Francis 2011-04-19 04:28:10

+0

不是 - '.split'方法仅用于基于字符的分割。 – 2011-04-19 04:32:00

+0

这是迄今为止我找到的最佳解决方案。做得好! – 2017-01-24 20:06:47

7

一个差成3块,串入的3块是重模块与字符串,而不是名单。

如果性能是重要的(即要拆分数千字符串),你应该测试各种答案在你的应用

>>> import re 
>>> re.findall('...','XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

>>> chunksize=3 
>>> re.findall('.{%s}'%chunksize,'XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

这工作,因为.意味着“匹配任何字符”正则表达式中如何比较。
.{3}意思是 “匹配的3个字符”,依此类推

1

复制从How do you split a list into evenly sized chunks in Python?答案自2008年11月:

从Python文档

直接(食谱itertools):

from itertools import izip, chain, repeat 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n) 

的如JFSebastian所示:

from itertools import izip_longest 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 

我猜guido的ti我机器工作 - 工作 - 将工作 - 将工作 - 再次工作。

相关问题