0

我有一长串字符需要拆分成更小的块,但是这些块需要重叠。输出字符串的长度和重叠应该是可变的。

例子:

从文本文件开始:

-----------------------------------------------------

输出是这样写的:

---------------------
---------------------
---------------------
4

3 回答 3

3

我认为你的意思是:

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]where开始的索引,step = chunksize-overlapsize然后返回这些位置的文本,长度为 chunksize。

用法

然后可以按如下方式使用此函数:

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)
于 2012-07-24T17:42:29.347 回答
2

给定一个字符串s,你可以使用slices得到一个子序列:

>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'

其中切片为您提供第 0 个字符,直到(但不包括)第 5 个字符。该range(start, end, step)函数给出一个数字列表,从start最多end增加step

>>> range(0, len(s), 6)
[0, 6, 12, 18, 24]

将两者结合起来会给你类似的东西

>>> for i in range(0, len(s), 6):
...     print s[i:i+8]
... 
abcdefgh
ghijklmn
mnopqrst
stuvwxyz
yz

因为切片操作是“宽容的”,它仍然会在最后一行产生一个简短的答案,其中来自s[24:34].

于 2012-07-24T17:49:45.023 回答
0

纯重击:

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"
于 2012-07-25T10:35:40.923 回答