2012-07-24 45 views
0

我有一長串字符需要拆分成較小的塊,但塊需要重疊。輸出字符串的長度和重疊應該是可變的。將很長的字符串拆分爲字符重疊的較小字符塊

例子:

在一個文本文件,以此爲出發點:

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

隨着輸出被寫成這樣:

--------------------- 
--------------------- 
--------------------- 
+4

這是令人困惑,因爲你的例子只是一個字符重複,所以目前還不清楚它是如何重疊。如果字符串是ABCDEFGHI ...等,該怎麼辦? – 2012-07-24 17:25:04

+0

嗨戴夫,謝謝你的迴應。 我只是想讓我的例子儘可能簡單。我試圖弄清楚這些字符串大部分會重疊的想法,但是通過X來移位寄存器。 – Witold 2012-07-24 17:50:10

+0

對於更簡單的答案,我會看@msw寫的是什麼;下一步是使用列表解析,如下所述。 – jmetz 2012-07-24 17:53:48

回答

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]開始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) 
+0

嗨Mutzmatron, 感謝您的迴應!對不起,密集,但輸出去哪裏?我在def下添加了f = open(「textin」,「r」),但是我沒有掌握如何添加輸出。 – Witold 2012-07-24 18:01:43

+0

'def ...'用於定義一個函數,並返回一個字符串列表,以便您可以使用它,例如,在文件的'writelines'函數中。我會更多地編輯代碼... – jmetz 2012-07-24 18:04:10

2

給定一個字符串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個字符的簡短回答。

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" 
相關問題