2015年09月23日

pythonのlistでgetOrElse的なこと

pythonのlistからインデックス指定で要素を取ろうとしたけど要素がなかった場合にデフォルト値を返したい。そんな時にどう書くと良いのかわからなかったので調べる。こんな感じで良いんだろうか。

まず、普通にやると要素数が足りない時にエラーになる。

lst = [0, 1, 2, 3]
lst[5]
  #=> IndexError: list index out of range

真っ先に思いついたのはtryを使う方法だけどこれはなんだかなぁ。

default_value = -1
lst = [0, 1, 2, 3]
try:
  x = lst[5]
except IndexError:
  x = default_value

x
  #=> -1

if 〜 else使うのが一般的か。

x = lst[5] if len(lst) > 5 else -1
x
  #=> -1

iterを使う方法もあるらしい。こっちの方がコード的には若干短くはなる。

x = next( iter(lst[5:]), -1 )
x
  #=> -1

StackOverflowを参考にした。

上記のページにはdictに変換してgetするという手も書いてあった。

x = dict(enumerate(lst)).get(5, -1)

ものすごく強引なやり方としては、指定長までデフォルト値で埋めた配列を用意してしまっても可能なことは可能。

x = (lst + [-1] * 5)[5]

指定indexではなくheadやlastを取りたい場合。インデックス指定で取れることは取れる。

first = lst[0]
  #=> 0

last = lst[-1]
  #=> 3

但し要素が空の場合はこれだとエラーになるので、ifは付けないといけない。

lst = []

first = lst[0] if lst else -1
first
  #=> -1

last = lst[-1] if lst else -1
last
  #=> -1