listの逆順を取得する
Pythonでは[::-1]でリストの逆順を取得できます。
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list
[1, 5, 2, 3, 4]
>>> num_list[::-1]
[4, 3, 2, 5, 1]
解説
Pythonではlistなどのシーケンスオブジェクトに対してスライスと呼ばれる操作で範囲を指定して要素を選択できます。スライスは以下のように3つの値(start, end, step)をコロンで区切って指定します。
[start:end:step]
startは指定する範囲の先頭、endは末尾(末尾は範囲に含まれない)、stepは間隔であり、それぞれを指定すると以下のように動作します。
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[1:3:1] # 1番目から3番目までを1個間隔
[5, 2]
>>> num_list[0:4:2] # 0番目から4番目までを2個間隔
[1, 2]
>>> num_list[0:5:2] # 0番目から5番目までを2個間隔
[1, 2, 4]
>>> num_list[1:5:2] # 1番目から5番目までを2個間隔
[5, 3]
このstart、end、stepはそれぞれ省略可能であり、省略すると以下のように扱われます
- start : オブジェクトの最初の要素
- end : オブジェクトの最後の要素
- step : 1
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[:4:1] # startを省略することで最初の要素から選択
[1, 5, 2, 3]
>>> num_list[1::1] # endを省略することで最後の要素まで選択
[5, 2, 3, 4]
>>> num_list[1:4:] # stepを省略することで1個間隔で選択
[5, 2, 3]
>>> num_list[1:4] # stepを省略する場合は2つ目のコロンを省略可能
[5, 2, 3]
また、start、end、stepにはそれぞれ負の値が指定可能であり、start、endはオブジェクトの末尾から数えた位置、stepは末尾から逆順で指定できます。
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[-4:] # 末尾から4番目(2番目)から選択
[5, 2, 3]
>>> num_list[:-2] # 末尾から2番目(4番目)まで選択
[1, 5, 2]
>>> num_list[3:1:-1] # 3番目から1番目までを逆順に選択
[3, 2]
# stepが負の場合はstartとendの大小関係が逆になるので注意
なので、この記事の最初のスライス操作は__startとendをそれぞれ省略し、stepが-1なので逆順に1つ間隔でlistからlistを選択する操作__になります
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[::-1]
[4, 3, 2, 5, 1]
ただし、スライス操作で選択したリストは別のオブジェクトとして扱われます。なので、元のオブジェクトには影響を与えません。
>>> num_list = [1, 5, 2, 3, 4]
>>> id(num_list)
4513463240
>>> id(num_list[::-1])
4513365768 # 別のidになっている
>>> num_list # 逆順のlistを選択したが順番は変わっていない
[1, 5, 2, 3, 4]
>>> num_list[:] # start、end、stepを省略して同一な別オブジェクトのlistを選択
[1, 5, 2, 3, 4]
# start、end、stepを全て省略したスライスはshallow copyとして使うことができる