将很长的字符串拆分为字符重叠的较小字符块
问题描述:
我有一长串字符需要拆分成较小的块,但块需要重叠。输出字符串的长度和重叠应该是可变的。将很长的字符串拆分为字符重叠的较小字符块
例子:
在一个文本文件,以此为出发点:
-----------------------------------------------------
随着输出被写成这样:
---------------------
---------------------
---------------------
答
我想你的意思是这样的:
def get_overlapped_chunks(textin, chunksize, overlapsize):
return [ textin[a:a+chunksize] for a in range(0,len(textin), chunksize-overlapsize)]
说明
这里我用一个列表理解,这只是获取输出字符串应该在哪里[0, step, 2*step,..., len(input)-chunksize]
开始step = chunksize-overlapsize
指数,然后在这些位置返回长度CHUNKSIZE的文本。
使用
此功能可以被用来如下:
>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'
其中:
textin = ''.join(open(FILENAME, 'r').readlines()) # text as single line
CHUNKSIZE=10
OVERLAPSIZE = 2
chunks = get_overlapped_chunks(textin, CHUNKSIZE, OVERLAPSIZE)
fout = open(FILEOUT, 'w')
fout.writelines(chunks)
答
给定一个字符串s
,您可以使用片得到一个序列切片给你的第0个字符直到(但不包括)第5个字符aracter。该range(start, end, step)
功能给出了step
>>> range(0, len(s), 6)
[0, 6, 12, 18, 24]
开始start
高达end
越来越多的列表,两者结合让你像
>>> for i in range(0, len(s), 6):
... print s[i:i+8]
...
abcdefgh
ghijklmn
mnopqrst
stuvwxyz
yz
因为片操作是“宽容”,它仍产生从s[24:34]
开始的最后一行有少于8个字符的简短回答。
答
纯击:
length=20
overlap=3
while read line ; do
idx=0
while [ $idx -lt ${#line} ] ; do
echo "${line:idx:length}"
((idx+=length-overlap))
done
done < "$infile"
这是令人困惑,因为你的例子只是一个字符重复,所以目前还不清楚它是如何重叠。如果字符串是ABCDEFGHI ...等,该怎么办? – 2012-07-24 17:25:04
嗨戴夫,谢谢你的回应。 我只是想让我的例子尽可能简单。我试图弄清楚这些字符串大部分会重叠的想法,但是通过X来移位寄存器。 – Witold 2012-07-24 17:50:10
对于更简单的答案,我会看@msw写的是什么;下一步是使用列表解析,如下所述。 – jmetz 2012-07-24 17:53:48