summer_tree_home

Check iOでPython3をマスターするぜっ

Even the last (Library 2.0) - リストのスライス

どんな問題?

Even the last
http://www.checkio.org/mission/even-last/

数字のリストから、偶数番目(index=0,2,4...)の要素を取り出して合計値を求める。
その合計値とリストの最後の要素と掛け合わせよ。

偶数番目というのがまぎらわしいが、最初の要素はindex=0だから偶数番目として扱う。
リストが空([ ])なら0を返す。

どうやって解く?

偶数番目を取り出すには、スライスを使って array[::2] とする。
最後の要素は、array[-1]となる。
この2つを掛ければいい。

IndexErrorに注意

arrayが[ ]のとき、array[-1]ではIndexErrorが発生する。array[::2] や sum([]) はエラーにはならない。

>>> a = []
>>> a[::2]
[]

>>> sum([])
0

>>> a[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

リストが空かどうかの判定

PEP 8Google Python スタイルガイドによれば、リストが空かどうかの判定は、

if array == []:
    pass  # arrayが空のとき
if len(array) == 0:
    pass  # arrayが空のとき

と書くよりも

if not array:
    pass  # arrayが空のとき
if array:
    pass  # arrayが空でないとき

と書く方が好ましいらしい。個人的には、array == [] の方がわかりやすいと思うんだけど。

コードはこちら

def checkio(array):
    return sum(array[::2]) * array[-1] if array else 0

ラムダ式で書いてみたり。

checkio = lambda array: sum(array[::2]) * array[-1] if array else 0

他の人の答え

http://www.checkio.org/mission/even-last/publications/shisashi/python-3/first/

checkio = lambda array: sum(array[::2]) * sum(array[-1:])

array[-1:] とすることで、arrayが[]のときにIndexErrorを発生させないテクニック。
これは思いつかなかった。