2016-03-04 35 views
1

我想我的字符串分割成5塊這個塊:嘗試將字符串分成5

message = [no_space[i + i+5] for i in range(0, len(no_space))] 

no_space是沒有空格

相同字符串,但代碼保持輸出:

IndexError: list index out of range 

字符串長度爲171

那麼,如何解決這一問題?

+0

相關:什麼是最「Python化」的方式來遍歷在塊列表(http://stackoverflow.com/q/434287/4279) – jfs

回答

3

你可能打算這樣做:

message = [no_space[i:i+5] for i in range(0, len(no_space), 5)] 

想想在你的代碼會發生什麼特定i,說9090是完全的範圍內,因爲您指定的範圍爲0達到(但不包括)len(no_space),這是171

如果i == 90,然後i + i+5 == 90 + 90+5 == 185。然後您請求no_space的元素185no_space[185]。由於no_space只有171字符長,你不能請求元素185,並讓您得到IndexError

希望這個例子會解釋這個新的代碼是如何工作的,用短串並分裂成3的:

>>> s = 'abcdefghijk' 
>>> len(s) 
11 
>>> list(range(0, len(s), 3)) 
[0, 3, 6, 9] 
>>> s[0:3] 
'abc' 
>>> s[3:6] 
'def' 
>>> s[6:9] 
'ghi' 
>>> s[9:12] 
'jk' 
>>> [(i, i+3) for i in range(0, len(s), 3)] 
[(0, 3), (3, 6), (6, 9), (9, 12)] 
>>> [s[i:i+3] for i in range(0, len(s), 3)] 
['abc', 'def', 'ghi', 'jk'] 
+0

Thansk你的第一塊代碼工作,但究竟是什麼意思? –

+0

謝謝!這段代碼工作得很好。然而,在不太明白這意味着什麼,所以請詳細說明這個問題 –

+0

@ ZacCotterell在手機上,但看到列表理解 – Kupiakos

0
message = [no_space[i + i+5] for i in range(0, len(no_space))] 

試圖在最後一指數的5得到值我。因此,當您嘗試使用168的I例如,你要超出允許指數I + 5

我也注意到在no_space的指數使用+的錯字。我認爲你打算分一杯羹。例如,當我是10時,你實際上得到了索引爲25的單個元素。當我是83時,你得到的索引是171,這是一個無效索引。

如果你抓住的5片,你需要跳到下一個可用的索引(每次加5)和固定片錯字。

message = [no_space[i:i+5] for i in range(0, len(no_space), 5)] 
1

Funcy(提供各種有用的工具,庫同時支持Python 2和3)提供了一個chunks function認爲正是這一點:

>>> import funcy 
>>> data = b'abcdefghijklmnopqrstuvwxyz' 
>>> list(funcy.chunks(6, data)) 
[b'abcdef', b'ghijkl', b'mnopqr', b'stuvwx', b'yz'] # Python 3 
['abcdef', 'ghijkl', 'mnopqr', 'stuvwx', 'yz']  # Python 2.7 

或者,您可以包括在一個簡單的實現這個你程序(兼容Python 2.7和3):

def chunked(size, source): 
    for i in range(0, len(source), size): 
     yield source[i:i+size] 

它的行爲相同(至少對於您的數據; Funcy的chunks還與迭代器,這並不):

>>> list(chunked(6, data)) 
[b'abcdef', b'ghijkl', b'mnopqr', b'stuvwx', b'yz'] # Python 3 
['abcdef', 'ghijkl', 'mnopqr', 'stuvwx', 'yz']  # Python 2.7