Как отрезать строку каждые 3 индекса?

Я использую Python для работы в лаборатории, в которой я работаю. Как я могу вырезать каждые 3 символа в заданной строке и добавить ее в список?

то есть. XXXxxxXXXxxxXXXxxxXXXxxxXXX (где X или x - любая буква)

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX'
mylist = []

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

Я хочу, чтобы список выглядел так: ['XXX', 'xxx', 'XXX', 'xxx', 'XXX'.... и т.д.]

Любые идеи?

Ответ 1

Короче говоря, вы не можете.

Дольше вам нужно будет написать свою собственную функцию, возможно:

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

Ответ 2

одно различие между списками расщепления на куски 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 символам" и т.д.

Ответ 3

Насколько я знаю, нет встроенного метода, который позволяет вам разбивать str на каждые 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']

Ответ 4

Копирование ответа из Как вы разбиваете список на куски с равномерным размером в Python? с ноября 2008 года:

Непосредственно из документации 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)

Альтернативный подход, предложенный Ж. Ф. Шебастином:

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 работает - будет работать - будет работать - снова работала.