关于python:如何每3个索引切一个字符串?

How do I slice a string every 3 indices?

本问题已经有最佳答案,请猛点这里访问。

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

即:XXXXXXXXXXXXXXXXXXXXXXXXXX(其中x或x是任何给定的字母)

1
2
3
4
5
6
string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX'
mylist = []

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

我希望列表如下所示:【XXX】、【XXX】、【XXX】、【XXX】、【XXX】等】

有什么想法吗?


简而言之,你不能。

在更长的时间内,您需要编写自己的函数,可能:

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

例如:

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

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

如果性能很重要(即要拆分数千个字符串),则应测试应用程序中各种答案的比较方式。

1
2
3
4
5
6
7
>>> 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个字符匹配",依此类推。


据我所知,没有内置方法允许您将str的每个x索引分块。但是,这应该有效:

1
2
3
4
5
6
 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)

生产:

1
['str', 'ing', 'Str', 'ing', 'Str', 'ing', 'Str', 'ing']


从如何在python中将列表分割成大小均匀的块中复制答案?自11月2008日以来:

直接从python文档(itertools的配方)中获取:

1
2
3
4
5
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的建议,另一种方法是:

1
2
3
4
5
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)

我猜吉多的时间机器工作会工作,会工作,会再次工作。