Python、機械学習

【Python】リスト、Numpy配列に[::-1]をつけると、順番を逆にできる(逆順にソート)

PythonのリストやNumpy配列を逆順に並び替える場面、時々あると思います。

リストやNumpy配列の値の取り出し方のルールを知っていれば簡単に覚えられます。

以下、リストを使って方法を説明しますが、Numpy配列でも全く同じことができます。

リストやNumpy配列に[::-1]をつければOK

ずばり、リストやNumpy配列に[::-1]をつければ逆順になります。

ドラクエのパーティーを例に考えます。

import numpy as np

party = ['戦士', '勇者', '僧侶', '魔法使い']

partyに[::-1]をつけると、このように値が取り出されます。

party[::-1]

[‘魔法使い’, ‘僧侶’, ‘勇者’, ‘戦士’]

なぜ[::-1]とするのか?

「なんだか「:」が2個続いていて気持ち悪い!」

そう思った方も多いでしょう。しかしながら、次のルールを知っていれば何の違和感もなく受け入れられるようになります。

リストやNumpy配列から値を取り出す場合、次のようなルールがあります。

リスト[〇〇:△△:□□]

〇〇:取り出す範囲の開始位置
△△:取り出す範囲の終了位置
□□:何個おきに取り出すか

通常、□□のところは省略することがほとんどです。省略すると、デフォルト設定である「1個おきに取り出す」となります。

ちなみに、〇〇を省略すると「一番最初から」、△△を省略すると「一番最後まで」という意味になります。

例えば、以下の2つは全く同じ意味です。

party[0:3]

[‘戦士’, ‘勇者’, ‘僧侶’]

party[0:3:1]

[‘戦士’, ‘勇者’, ‘僧侶’]

以下の5つも全く同じです!!

party[0:4]

 

party[0:]

 

party[:4]

 

party[:]

 

party[::1]

[‘戦士’, ‘勇者’, ‘僧侶’, ‘魔法使い’]

そして、最後の□□の値をマイナスにすると、逆から並べてくれます。

party[::-1]

[‘魔法使い’, ‘僧侶’, ‘勇者’, ‘戦士’]

「:」が2個続く理由は、こういうことだったんですね。

注意点!

「リスト[〇〇:△△:□□]」のうち、□□を-1にして、さらに〇〇や△△も指定する場合は注意が必要です。

party[::-1]

[‘魔法使い’, ‘僧侶’, ‘勇者’, ‘戦士’]

party[0:4:-1]

[]
[0:4:-1]としてしまうと空っぽのリストが返ってきます。

□□がマイナスの場合は、△△が取り出す範囲の開始位置、〇〇が取り出す範囲の終了位置になるからです。

ですので、次のように書いてください。

party[3::-1]

[‘魔法使い’, ‘僧侶’, ‘勇者’, ‘戦士’]

リストのindexが0から3のときは[0:4]という風に、終了位置は1個先にするルールがあったのと同じで、indexが3から0のときは[3:(0から1個先の値)]とします。

しかしながら、終了位置が0の場合、1個先の値がないため(-1にするとうまくいかない)、[3:]とします。

もし、indexが3から1の場合、[3:0]とすればOKです。

補足

1個飛ばしもできる

□□を2にすれば、1個飛ばしで値を取ることができます。

party[0:4:2]

[‘戦士’, ‘僧侶’]

後ろから何番目、という指定の仕方もできる

マイナスをつけることで、後ろから何番目か、という形で指定できます。indexの数が多い場合、後ろの方の値を取り出すときに便利です。

party[-3:-1]

[‘勇者’, ‘僧侶’]

party[-3:]

[‘勇者’, ‘僧侶’, ‘魔法使い’]