0

私は次の配列を持っています(Pythonで):

arr= ['\n', ' a#B\n', ' c#D\n'] 

今、私は以下に示すコードを書いている「#」で分割しようとしています:

 for i in arr:
 g=i.split("#")[1]

次のエラーが表示されます。

 g=i.split("#")[1]
 IndexError: list index out of range

エラーが発生する理由がわかりません。誰かがそれを修正するのを手伝ってくれるほど親切にできますか.

4

4 に答える 4

2

他の人は、なぜその例外が発生するのかを説明しています。これは、あなたにとって役立つかもしれない別のアプローチのアイデアです。

Python 2.5 から、文字列オブジェクトは新しいpartitionメソッドになりました:

str.partition(sep)

sep の最初の出現で文字列を分割し、区切り記号の前の部分、区切り記号自体、および区切り記号の後の部分を含む 3 つのタプルを返します。区切り文字が見つからない場合は、文字列自体とそれに続く 2 つの空の文字列を含む 3 つのタプルを返します。

>>> arr= ['\n', ' a#B\n', ' c#D\n'] 
>>> for s in arr:
...     print s.partition('#')
... 
('\n', '', '')
(' a', '#', 'B\n')
(' c', '#', 'D\n')

セパレーターが見つかったかどうかに関係なく、例外に遭遇することなく文字列を引き離すことができます。

于 2012-06-15T18:38:32.773 に答える
2

リストの最初の要素'\n'が に割り当てられている場合、iが含まれていない"#"ため、結果リストは 2 つではなく 1 つの要素のみになります。インデックスを取得しようとすると1失敗しますが、インデックス0は存在します。

于 2012-06-15T18:32:06.763 に答える
1

このエラーは、最初の分割で要素が 1 つしか含まれないリストが生成され['\n']、 のインデックス値[1]が範囲外になるために発生します。

見る:

for i in arr:
   g = i.split("#")
   print g

出力:

['\n']
[' a', 'B\n']
[' c', 'D\n']

それを修正する簡単な方法の1つは次のとおりです。

[i.split('#')[1] for i in arr if len(i.split('#')) > 1]

ただし、 への 2 つの呼び出しが含まれていますsplit()

以下はもう少し冗長ですが、呼び出しはsplit()1 回だけです。

for i in arr:
    g = i.split('#')
    if len(g) > 1:
       g = g[1]

以下のコメントで @kindall が示唆しているように、ここでも の使用はpartition()代替手段split()です。

于 2012-06-15T18:31:57.713 に答える
0

反復処理する配列の最初の要素にはハッシュがない#ため、split を呼び出すと、リスト内の 1 つの項目のみが返される['\n']ため、2 番目の項目にアクセスしようとする[1]と、エラー。

Python では、インデックスは 1 ではなく 0 から始まることに注意してください。

于 2012-06-15T18:33:01.337 に答える