考虑到带有数字的文本行,我想将其分成十个字符的片段,但如果它们存在,我想接受少于十个的片段。
使用我的脚本,我可以获得四个完整的组,使用10作为固定长度,但最后四个字符丢失。
正确的输出是:
['0123456789', '0123456789', '0123456789', '0123456789', '0123']
但我只是得到了这个:
['0123456789', '0123456789', '0123456789', '0123456789']
是否有任何建议要修复这些行以获得预期结果?
step = 10
seq = "0123456789012345678901234567890123"
parts = []
for i in range(len(seq)/step):
sub = seq[i * step: (i + 1) * step]
parts.append(sub)
print parts
答案 0 :(得分:4)
您可以修改range
以step
前进:
step = 10
seq = "0123456789012345678901234567890123"
parts = []
for i in range(0, len(seq), step):
sub = seq[i: i + step]
parts.append(sub)
print parts
输出:
['0123456789', '0123456789', '0123456789', '0123']
答案 1 :(得分:2)
len(seq) < step
将返回range(len(seq)/step)
,因此您只会进行3次循环迭代。
你可以修改它以添加1,如下所示:
[0, 1, 2]
但如果序列是for i in range(len(seq)//step+1):
的精确倍数,则会导致列表的最后一个元素为空字符串step
。要解决此问题,您可以添加''
语句,以便不附加空字符串或以不同方式计算范围。我推荐以下内容:
if
需要注意的另一点是我使用step = 10
seq = "0123456789012345678901234567890123"
parts = []
nSteps = len(seq)//step + (0 if len(seq)%step == 0 else 1)
for i in range(nSteps):
sub = seq[i * step: (i + 1) * step]
parts.append(sub)
print(parts)
#['0123456789', '0123456789', '0123456789', '0123']
代替//
来表示整数除法。这在python2中没有什么区别,但后者会在python3中破坏你的代码。同样,我使用/
作为函数而不是语句。
答案 2 :(得分:1)
step = 10
seq = "0123456789012345678901234567890123"
chunks = []
while len(seq) > 0:
chunks.append(seq[:step])
seq = seq[step:]
在每次迭代中,这都会占用step
的{{1}} - 长度开头部分,并将其附加到seq
列表。由于chunks
在seq[:step]
时也有效,因此无论最后一部分的长度如何,这在上一次迭代中也能正常工作。
答案 3 :(得分:0)
You might want to try a condition that allows for the last case to show up:
step = 10
seq = "0123456789012345678901234567890123"
parts = []
for i in range(len(seq)/step):
if i> (len(seq)/step)*(step - 1):
sub = seq[(i-1)*step:]
else:
sub = seq[i * step: (i + 1) * step]
parts.append(sub)
print parts