2008年9月18日木曜日

Python でリストの要素を指定 – car, cdr に相当するもの

リストに対して操作をするとき、その要素を簡単に指定できると楽。

2.3.6 シーケンス型 によると、(太字は引用者による)

s[i]
s の 0 から数えて i 番目の要素 (…)

i または j負の数の場合、インデクスは文字列の末端からの相対インデクスになります

マイナスつければ末尾から指定できるの忘れてた。 パタッ(o_ _)o~† 気づかずこんな冗長な書き方を… 。

a[len(a)-1]
a[:len(a)-1]

忘れないように図を書いておこう。

080918-001

 

上記に特別な名前を付けていないところが Python 流ということかな?

ついでにコードも書いておく。

a = [1,2,3,4,5]

print u"先頭の要素: ",  a[0]
print u"2 番目以降の要素のリスト: ", a[1:]

print u"最後の要素: ", a[-1]
print u"最後の要素よりも前にある要素のリスト", a[:-1]

 

他の言語では

 LISP – Wikipedia によると、

LISPは当初IBM 704上で実装されたが、その計算機上の2つの命令がLISPの基本操作car(Contents of Address Register)、cdr(Contents of Decrement Register)になった。 ほとんどのLISPの方言において、carcdrはそれぞれlistの最初の要素と、最初の要素以外を返す操作である。

 

Ruby には、Array - Rubyリファレンスマニュアル に要素の先頭と末尾を取得するための first, last がある。

 

Haskell では、head, tail と init, last 。(cf. Haskell で リストの n 番目の要素を取得 – PreludeList の !! )

 

リスト処理関数 によると、Scheme には、

carはリストの先頭の要素,cdrはリストの先頭の要素を除いたリストを返すと考えてもよい.これらに加えて,2番目の要素を返すcadr,3番目以降要素を含むリストを返すcddr,先頭の要素がリストであるときに,その先頭の要素を返すcaar などの関数など,4つまでのaかdを含む関数がシステムに用意されている.

 

スライスオブジェクト

3.2 標準型の階層 の内部型 (internal type) に、

スライス (slice) オブジェクト

スライスオブジェクトは 拡張スライス構文 (extended slice syntax) が使われた際にスライスを表現するために使われます。拡張スライス構文とは、二つのコロンや、コンマで区切られた複数のスライスや省略符号 (ellipse) を使ったスライスで、例えば a[i:j:step]a[i:j, k:l] 、あるいは a[..., i:j] です。スライスオブジェクトは組み込み関数 slice() で生成されます。 (…)

 

要素へアクセスするための特殊メソッド」で実装した __getitem__(self, key) が関係している。