-1

我正在尝试对以下字符串进行切片,但我的代码在第二个循环之后没有返回任何内容。

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 中给出的字符串长度的情况下将该字符串循环并切片。

我可能做错了什么?

谢谢。

4

2 回答 2

4

更新 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, None)]. 因此,列表元素需要移动一个索引。

>>> [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]which 将给出一张来自 index 的幻灯片i to 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:]

于 2013-02-23T08:41:38.627 回答
3

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

第一次迭代:0,5

第二次迭代:5,20

第三次迭代:25,20 <——这就是问题所在。

请注意,这是因为您只是不断添加start,因此它会越来越大。

编辑:我刚刚意识到您可能误解了 Python 切片语法。第二项不是切片的长度;相反,它是未包含在切片中的第一个元素的索引。

如果你想对字符串进行分区(即有一组没有重叠的切片,使得它们的连接等于原始字符串),而不是使用+=,只需使用=,并设置d以便每个值d都是你所在的索引希望剪一个。(请注意,这些索引必须按升序排列。)

或者,如果您希望每个值d表示分区中每个切片的大小,请使用以下代码:

for x in d:
    print s[start:start+x]
    start += x
于 2013-02-23T08:43:50.780 回答