Pythonでlistの要素を「飛ばし」で取得する

飛ばし

Pythonのlistでは、「飛ばし」で要素を取得することができます。
例えば、0~9のリストから偶数のリストを作成できます。

1
2
3
4
5
>>> L = list(range(10))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> L[::2]
[0, 2, 4, 6, 8]

コロン区切りで3つ目に与える値によって、何個飛ばしかが決まります。
この値のことを、stepstrieと呼びます。

1
2
>>> L[::3]
[0, 3, 6, 9]

返却されるリストの要素数は元の要素数/stepを切り上げた値となります。

start, stopとの組み合わせ

よく見るstart,stopのスライスと組み合わせることもできます。

  • 2以上6未満

    1
    2
    >>> L[2:6]
    [2, 3, 4, 5]
  • 2以上6未満を3個飛ばし

    1
    2
    >>> L[2:6:3]
    [2, 5]

返却されるリストの要素数は指定された区間の要素数/stepを切り上げた値となります。

1
>>> L[2:6:3]

1
>>> L[2:6][::3]

と等価ということになります。(ただし、stepが正の場合)

逆順

-1を指定することで、リストを逆順に呼べます。

1
2
>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

start,stopと組み合わせる場合は次のように記述します。

1
2
>>> L[9:1:-1]
[9, 8, 7, 6, 5, 4, 3, 2]

start>stopとする必要があることに注意してください。

応用

では、逆向きに一個飛ばしとなるようなリストを取得したい場合はどうすれば良いでしょうか。

1
2
>>> L[::-1][::2]
[9, 7, 5, 3, 1]

としても良いですが、

1
2
>>> L[::-2]
[9, 7, 5, 3, 1]

このようにも書けます。

最後に

これだとどうなるでしょうか。これが分かれば完璧です。

1
>>> L[7:1:-2]

参考

https://docs.python.org/2.3/whatsnew/section-slices.html

おわりに

MENTAというサービスでプログラミング学習のサポートをしています。競技プログラミングについてもサポートできるので、ご興味がある方はぜひMENTAのDMでご連絡いただければと思います。

記事情報

  • 投稿日:2020年2月5日
  • 最終更新日:2022年1月8日