更新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:]
什麼是' d'在你的代碼中? – ATOzTOA 2013-02-23 08:38:20
oops。錯過了一些代碼。 D是一個列表。我已經糾正它 – lukik 2013-02-23 08:40:47