-1

次の文字列をスライスしようとしていますが、コードは2番目のループを超えて何も返しません。

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で指定された文字列の長さを指定して、その文字列をループして断片にスライスする必要があります。

何が間違っているのでしょうか?

ありがとう。

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]インデックスからスライドを提供するを呼び出します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

問題は、2番目のインデックスが最初のインデックスよりも大きいスライスを作成していることです。の指定された値に対してd、スライスは次のようになります。

最初の反復:0,5

2回目の反復:5,20

3回目の反復:25,20<-これが問題の原因です。

これは、に追加しstart続けるため、どんどん大きくなっていくためです。

編集:Pythonスライス構文を誤って解釈している可能性があることに気づきました。2番目の項目はスライスの長さではありません。むしろ、それはスライスに含まれていない最初の要素のインデックスです。

文字列を分割する場合(つまり、連結が元の文字列と等しくなるようにオーバーラップのないスライスのセットがある場合)、を使用する代わりに、を使用し+=て、の各値が次のインデックスになるよう=に設定します。カットが行われることを望みます。(これらのインデックスは昇順である必要があることに注意してください。)dd

または、の各値でdパーティション内の各スライスのサイズを表す場合は、次のコードを使用します。

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