2015-04-03 63 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']