我有一長串字符需要拆分成較小的塊,但塊需要重疊。輸出字符串的長度和重疊應該是可變的。將很長的字符串拆分爲字符重疊的較小字符塊
例子:
在一個文本文件,以此爲出發點:
-----------------------------------------------------
隨着輸出被寫成這樣:
---------------------
---------------------
---------------------
我有一長串字符需要拆分成較小的塊,但塊需要重疊。輸出字符串的長度和重疊應該是可變的。將很長的字符串拆分爲字符重疊的較小字符塊
例子:
在一個文本文件,以此爲出發點:
-----------------------------------------------------
隨着輸出被寫成這樣:
---------------------
---------------------
---------------------
我想你的意思是這樣的:
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