2013-02-23 43 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