2015-04-03 76 views
1

我有一個很長的字符串。我想將這個字符串拆分爲長度爲16個字符的子字符串,每次跳過一個字符(例如,substring1 =字符串的前16個元素,從元素18到元素34的substring2等)並列出它們。list.append()我錯在哪裏?

我寫了下面的代碼:

string="abcd..." 
list=[] 
for j in range(0,int(len(string)/17)-1): 
    list.append(string[int(j*17):int(j*17+16)]) 

但它返回:

list=[] 

我無法弄清楚什麼是錯的這個代碼。

+0

你使用Python 2.7或Python 3? – seaotternerd 2015-04-03 17:21:27

+1

FYI'range'支持'step'參數,以便您可以產生'[start,start + step,start + 2 * step ...]' – 2015-04-03 17:22:42

+0

string的長度是多少? – 2015-04-03 17:22:44

回答

0
>>> string="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" 

你的原代碼,毫無遮攔內置(不包括最終的全長度的字符串,並在其後的任何部分字符串):

>>> l = [] 
>>> for j in range(0,int(len(string)/17)-1): 
...  l.append(string[int(j*17):int(j*17+16)]) 
... 
>>> l 
['abcdefghijklmnop', 'rstuvwxyzabcdefg', 'ijklmnopqrstuvwx'] 

清潔的版本,包括所有可能字符串:

>>> for j in range(0,len(string),17): 
...  l.append(string[j:j+16]) 
... 
>>> l 
['abcdefghijklmnop', 'rstuvwxyzabcdefg', 'ijklmnopqrstuvwx', 'zabcdefghijklmno', 'qrstuvwxyz'] 

我們如何將最後一個變成理解?每個人都喜歡理解。

>>> l = [string[j:j+16] for j in range(0,len(string),17)] 

我們可以過濾掉那些過於短暫,如果我們想串:

>>> l = [string[j:j+16] for j in range(0,len(string),17) if len(string[j:j+16])>=16] 
0

它可以工作 - 但只適用於長度超過16個字符的字符串。您有

range(0,int(len(string)/17)-1) 

但是,對於字符串「abcd ...」,int(len(string)/17)-1)爲-1。添加一些邏輯,以趕上< 16個字符的情況下,你是好:

... 
for j in range(0, max(1, int(len(string)/17)-1)): 
    ... 
0

下面應該工作:

#!/usr/bin/python 

string="abcdefghijklmnopqrstuvwxyz" 
liszt=[] 
leng=5 
for j in range(0,len(string)/leng): 
    ibeg=j*(leng+1) 
    liszt.append(string[ibeg:ibeg+leng]) 
if ibeg+leng+1 < len(string): 
    liszt.append(string[ibeg+leng:]) 
print liszt 
0

工作的呢?

>>> from string import ascii_lowercase 
>>> s = ascii_lowercase * 2 
>>> s 
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' 
>>> spl = [s[i:i+16] for i in range(0, len(s), 17)] 
>>> spl 
['abcdefghijklmnop', 'rstuvwxyzabcdefg', 'ijklmnopqrstuvwx', 'z']