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