Python:循环中的字符串切片

Python:循环中的字符串切片,python,string,Python,String,我试图分割下面的字符串,但是我的代码没有返回任何超过第二个循环的内容 s = "93011NULL 5011005874 A0000000000010000000000001JKL00000000NULL 00000000A63" d = [5,20,20,1,16,9,3,8,50,8,1,2] start = 0 for x in d: pri

我试图分割下面的字符串,但是我的代码没有返回任何超过第二个循环的内容

s = "93011NULL                5011005874          A0000000000010000000000001JKL00000000NULL                                              00000000A63"

d = [5,20,20,1,16,9,3,8,50,8,1,2]

start = 0
for x in d:
    print(s[start:x])
    start += x
当我运行该代码时,我只得到:

43011
NULL
其余十个循环打印“”即空字符串。理想情况下,它应该根据变量d中给定的字符串长度,将该字符串循环并切片为多个片段

我可能做错了什么


谢谢。

更新1

对于您的特定问题,解决方案如下所示:

s = "93011NULL                5011005874          A0000000000010000000000001JKL00000000NULL                                              00000000A63"
d = [5,20,20,1,16,9,3,8,50,8,1,2]

# Convert sizes to indexes
d = [sum(d[:i+1]) for i in range(len(d))]

splits = [s[i:j] for i, j in zip([0]+d, d+[None])]

print splits
输出

>>> 
['93011', 'NULL                ', '5011005874          ', 'A', '0000000000010000', '000000001', 'JKL', '00000000', 'NULL                                              ', '00000000', 'A', '63', '']

如果你需要切片,为什么不试试这个

>>> s = 'AA111-99XYZ '

>>> d = [2, 4, 5, 8, 11]

>>> [s[i:j] for i, j in zip([0]+d, d+[None])]

['AA', '11', '1', '-99', 'XYZ', ' ']
解释

zip
将多个列表作为参数,并生成一个集合列表,从每个输入列表中获取第i个元素

>>> zip(d, d)
[(2, 2), (4, 4), (5, 5), (8, 8), (11, 11)]
我们需要
[(0,2)、(2,4)、(4,5)、(5,8)、(8,11)、(11,无)]
。因此,需要将列表元素移位为索引

>>> [0] + d
[0, 2, 4, 5, 8, 11]

>>> d + [None]
[2, 4, 5, 8, 11, None]
现在我们调用
zip

>>> zip([0] + d, d + [None])
[(0, 2), (2, 4), (4, 5), (5, 8), (8, 11), (11, None)]
接下来,我们调用
s[i:j]
,它将给出从索引
i到j-1的幻灯片

>>> s[0:2]
'AA'
>>> s[2:4]
'11'
因此,我们创建一个列表理解来为zip输出中的每个条目生成一个切片列表

[ s[i:j] for i, j in zip([0] + d, d + [None]) ] 
这相当于

[ s[i:j] for i, j in [(0, 2), (2, 4), (4, 5), (5, 8), (8, 11), (11, None)] ]

最后一部分,
s[i:None]
s[i:][/code>

相同。您的问题是,您正在制作第二个索引大于第一个索引的切片。对于给定的
d
,切片如下所示:

第一次迭代:0,5

第二次迭代:5,20


第三次迭代:25,20代码中的
d
是什么。我错过了一些代码。D是一个列表。我已经改正了,代码实际上不好。参考Kyle Strand的答案。原始代码不正确,但此解决方案有点优雅。@AtozToa我喜欢你在那里所做的,但我真的不明白。你能解释一下你的解决方案吗?或者发一个链接到我能读到的地方?谢谢。@lukik我已经添加了一个解释…@ATOzTOA谢谢!我一定会仔细考虑一下这段有趣的代码。你在片段中用逗号而不是冒号,所以我帮你更正了它。谢谢你的解释。成功了。
for x in d:
    print s[start:start+x]
    start += x