静かなる名辞

pythonとプログラミングのこと



【python】1つおきにリスト・文字列などから抽出する

 スライスの基本的な話なんだけど、意外と知らない人が多いと思うので。

 スライスで1つおきに取り出すには、こうする。

>>> "hogehoge~"[::2]
'hghg~'

 スライスで指定できるのはstart, stop, stepであり、上のように指定するとstart, stopはNoneでstepが2になる。

 参考:【python】sliceのちょっと深イイ(かもしれない)話 - 静かなる名辞


 ではstepを1にすると? これは元の文字列が返る。

>>> "hogehoge~"[::1]
'hogehoge~'

 たまにこれをreverseに悪用(?)する人がいる。[::-1]と指定するとそういう挙動になるので。

>>> "hogehoge~"[::-1]
'~egohegoh'

 でもこれは可読性が悪い、というか完全に初見殺しなので、やめた方が良いと思う。reversedというものがあるので、そっちを使おう。・・・と書いてみたけど、腹立たしいことに空気を読まない子(iteratorで返してくれるアレ)なので、こんな真似をする必要がある。

>>> "".join(reversed("hogehoge~"))
'~egohegoh'

 どっちがマシかなぁ・・・。

 話をもとに戻して、[::-1]でこうなるということは、これもできる。1つおきに取り出して逆転させる。

>>> "hogehoge~"[::-2]
'~ghgh'

 便利、なのだろうか(どんなときに?)。