home changes contents help options

099:配列から複数の要素を一度に取得

複数の要素が連続しているならばスライス表記で取り出すことができます。 [i:j]? とすると i 番目から j 番目前までの値を得ることができます。

>>> a = [chr(i) for i in range(97, 97+26)]
>>> a
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> a[3:6]       # 3, 4, 5 番目の要素を得る。 6 番目は含まれない、これ重要。
['d', 'e', 'f']

i, j の値は省略することができます。 最初の値を省略すると 0 、最後の値を省略するとリスト長を指定したものとみなされます。 両方を省略することも可能です。

>>> a[:2]  # a[0:2] と同じ。 0 番目から 2 番目の前まで
['a', 'b']
>>> a[24:] # a[24:len(a)] つまり a[24:26] と同じ。 24番目から末尾まで。
['y', 'z']
>>> a[:]   # リストすべてを得る
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

複数要素が連続していなくとも、同じ間隔で並んでいるならば取り出せます。 スライス表記で3番目の値を指定します。これが飛び幅になります。

>>> a[3:8:2]     # 3, 5, 7 番目の要素を取り出す
['d', 'f', 'h']

Ruby における Array#values_at に相当するメソッドはありません。 次の関数で代用してください。

def values_at(seq, *index):
    return [seq[n] for n in index]
>>> values_at(a, 2, 3, 5)
['c', 'd', 'f']

python 2.5 以降では operator モジュールの itemgetter を使うことができます。要素取得用のオブジェクトが作られるので、これにリストを渡します。

>>> from operator import itemgetter
>>> getter = itemgetter(2, 3, 5)
>>> getter(a)
('c', 'd', 'f')