如何每 3 个索引切片一个字符串? [复制]

Posted

技术标签:

【中文标题】如何每 3 个索引切片一个字符串? [复制]【英文标题】:How do I slice a string every 3 indices? [duplicate] 【发布时间】:2011-08-08 08:40:13 【问题描述】:

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

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

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX'
mylist = []

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

我希望列表如下所示:['XXX','xxx','XXX','xxx','XXX'....等]

有什么想法吗?

【问题讨论】:

这与iterating over a list in chunks 非常相似——查看那里的答案以获得一些出色的方法。 【参考方案1】:

简而言之,你不能。

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

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

例如:

>>> 拆分(“xxxXXX”,3) ['xxx', 'XXX'] >>> 拆分(“xxXXXXXX”,3) ['xxx', 'XXX', 'xx']

【讨论】:

【参考方案2】:

据我所知,没有内置方法可以让您在每 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']

【讨论】:

甚至没有 .split() 方法? 不——.split 方法仅用于基于字符的拆分。 这是迄今为止我找到的最好的解决方案。干得好!【参考方案3】:

将列表分成 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 个字符”,依此类推

【讨论】:

【参考方案4】:

自 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 的时间机器工作——工作——将工作——将工作——又工作了。

【讨论】:

以上是关于如何每 3 个索引切片一个字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

go语言之字符串指针数组切片

为啥python的列表切片不会产生索引越界错误? [复制]

python3的学习之路八高级特性

索引和切片,字符倒着显示结果

Python12 切片迭代

学习python的日常3