2017-05-05 42 views
0

私は通常項目を含んでいますが、時には空のリストを持っています。Python - if文の範囲外のリストのインデックス

リストの3つの項目がデータベースに追加されますが、空の場合はif文を使用していてもエラーになります。

if item_list[0]: 
    one = item_list[0] 
else: 
    one = "Unknown" 

if item_list[1]: 
    two = item_list[1] 
else: 
    two = "Unknown" 

if item_list[2]: 
    three = item_list[2] 
else: 
    three = "Unknown" 

リストが空の場合、これはまだlist index out of rangeエラーが発生します。私はそれができる他の方法を見つけることができませんが、より良い方法がある必要があります(私はまた、elseステートメントを使用する必要があることをお読みください)

+1

私はあなたが 'else'ステートメントを使用してはならないことを読んで場所を知るのが大好きです。あなたはそれのための情報源を提供できますか? –

+0

@AustinHastings単なる情報源はありませんでした。 – Sen

答えて

2

リストが空の場合、リストにはインデックスがありません。リストのインデックスにアクセスしようとするとエラーが発生します。

実際にifステートメントでエラーが発生します。

あなたがこれを行うことで期待した結果を得ることができた:

one, two, three = item_list + ["unknown"] * (3 - len(item_list)) 

このコード行はitem_listの連結および未知の一覧(3マイナスitem_listの大きさ)」で構成される一時リストを作成"弦;これは常に3項目のリストです。それonetwothree変数


詳細で、その後unpacksこのリスト:

  • あなたが重複するアイテムで大きなリストを取得するために、リストを掛けることができます:['a', 1, None] * 2['a', 1, None, 'a', 1, None]を与えます。これは "unknow"文字列のリストを作成するために使用されます。リストに0を掛けると、(期待どおり)空のリストになることに注意してください。
  • 加算演算子を使用して、2つ(またはそれ以上)のリストを連結することができます。['a', 'b'] + [1, 2]['a', 'b', 1, 2]です。これは、item_listの3項目リストと、乗算によって作成された「不明な」リストを作成するために使用されます。
  • unpackの代入演算子を使用して複数の変数にリストを指定することができます。a, b = [1, 2]a = 1 and b = 2となります。拡張されたアンパックを使用することも可能です。a, *b = [1, 2, 3]a = 1 and b = [2, 3]です。

例:あなたは存在しない配列の要素にアクセスしようとした場合

>>> item_list = [42, 77] 
>>> one, two, three = item_list + ["unknown"] * (3 - len(item_list)) 
>>> one, two, three 
(42, 77, 'unknown') 
+0

完璧、ありがとう!インライン/圧縮スタイルについて知ることができるリソースがありますか?つまり、1,2,3 = item_list + ["unknown"] *(3 - len(item_list)))です。私はあなたがそれを何と呼ぶか​​についてはあまりよく分かりません – Sen

+0

@Sen:私は使用されたメカニズムについての詳細を追加しましたが、それぞれのドキュメントを見つけることはできません。私は、コンパクトコードを書くためのリソース指導を知らない。コンパクトなコードは、特にコードが理解しにくい場合は、常に良いことではないことに注意してください。言語についてのより便利な「トリック」を学びたい場合は、[公式のPythonチュートリアル](https://docs.python.org/3/tutorial/index.html)をご覧ください。 – Tryph

+0

超貴重です情報!私はチュートリアルをやったが、私はまだ学んでいる:)申し訳ありませんが、私は多くを求めていますが、上記の( ' 'item_list = [(" Get this string "、23)、(" Get this string too "、52)]'を使用すると、リスト内のリスト(?)に対して 'len(item_list)この場合、 'one =(" Get this string "、23)'の代わりに 'one ="を返します。 – Sen

0

item_list[1]は、リスト内の2つの要素。その動作はClojureのような言語ではなく、代わりにnull値が返されます。

代わりにlen(item_list) > 1を使用してください。

2

Pythonは、このエラーがスローされます。空の配列は、インデックス0

if item_list:  # an empty list will be evaluated as False 
    one = item_list[0] 
else: 
    one = "Unknown" 

if 1 < len(item_list): 
    two = item_list[1] 
else: 
    two = "Unknown" 

if 2 < len(item_list): 
    three = item_list[2] 
else: 
    three = "Unknown" 
0

を持っていませんので、あなたのリストがあなたから取得しようとしているインデックス位置に値を持つのに十分な長さかどうかを確認する必要があります。条件文にelseを使用しないようにする場合は、変数にデフォルト値をあらかじめ割り当てることができます。

count = len(item_list) 
one, two, three = "Unknown", "Unknown", "Unknown" 
if count > 0: 
    one = item_list[0] 
if count > 1: 
    two = item_list[1] 
if count > 2: 
    three = item_list[2] 
関連する問題