如何每3个索引切一个字符串?

时间:2011-04-19 04:02:32

标签: python string slice

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

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

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX'
mylist = []

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

我希望列表看起来像这样:['XXX','xxx','XXX','xxx','XXX'......等等]

有什么想法吗?

4 个答案:

答案 0 :(得分:20)

简而言之,你不能。

更长一段时间,你需要编写自己的函数,可能:

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']

答案 1 :(得分:7)

将列表拆分为3个块并将字符串拆分为3个块之间的一个区别是re模块使用字符串而不是列表。

如果性能很重要(即你要分割数千个字符串),你应该测试各种答案在你的应用程序中的比较

>>> 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个字符”,依此类推

答案 2 :(得分:4)

据我所知,没有内置方法可以让你在每个x索引中输入一个str。但是这应该有效:

 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']

答案 3 :(得分:1)

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

直接来自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)

另一种看法,正如J.F.Sebastian所建议的那样:

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的时间机器工作 - 工作 - 将有效 - 将再次工作。