以确定的长度切片文本

时间:2018-04-24 15:51:03

标签: python slice

考虑到带有数字的文本行,我想将其分成十个字符的片段,但如果它们存在,我想接受少于十个的片段。

使用我的脚本,我可以获得四个完整的组,使用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

4 个答案:

答案 0 :(得分:4)

您可以修改rangestep前进:

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列表。由于chunksseq[: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