2013-02-23 52 views
-1

我试图切片下面的字符串,但我的代码不会返回任何东西超过第二个循环。Python:字符串在一个循环中切片

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 

剩下10个打印 “”,即空字符串。理想情况下,它应该循环并将该字符串分割成片段,给定变量d中给出的字符串长度。

什么可能我是做错了什么?

谢谢。

+3

什么是' d'在你的代码中? – ATOzTOA 2013-02-23 08:38:20

+0

oops。错过了一些代码。 D是一个列表。我已经纠正它 – lukik 2013-02-23 08:40:47

回答

3

你的问题是,你正在做切片与第二指数大于第一个。对于d给定的值,你的片去如下:

第一次迭代:0,5

第二次迭代:5,20

第三次迭代:25,20 < - 这是那里的问题是。

请注意,这是因为你只是不断增加到start,所以它越来越大。

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

如果要分割字符串(即有没有重叠,使得它们的级联等于原始字符串一组切片),而不是使用+=,只要使用=,并成立了d,以便每个值在d是您希望进行剪辑的索引。 (请注意,这些指标必须是递增的顺序。)

另外,如果你想在d每个值来表示分区中的每个片的大小,使用下面的代码:

for x in d: 
    print s[start:start+x] 
    start += x 
+1

您为切片放置了逗号而不是冒号,因此我已经为您更正了它。 – Duncan 2013-02-23 08:50:48

+0

啊,是的,谢谢。 – 2013-02-23 08:51:45

+0

感谢您的解释。有效。 – lukik 2013-02-23 08:59:21

3

更新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]这将给从指数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:]

+1

代码实际上并不好。请参阅Kyle Strand的答案。 – TerryA 2013-02-23 08:46:35

+0

原始代码不正确,但此解决方案的优雅。 – 2013-02-23 08:50:19

+0

@AtozToa我喜欢你在那里做的,但我真的不明白。你能解释你的解决方案吗?或者发布一个链接到我可以阅读的地方?谢谢。 – lukik 2013-02-23 09:09:58