Pythonでデータを扱う際、「リスト(配列)の中から特定の範囲だけを抜き出したい」「逆順に並べ替えたい」といった要望を叶えてくれるのが「スライス」という機能です。
現在、データサイエンスやAI分野でPythonが主流となっている理由の一つも、こうした配列操作の簡潔さにあります。
この記事では、標準のリスト型での操作はもちろん、NumPyを使った2次元・多次元配列のスライス、マイナス指定、要素の代入方法までを分かりやすく体系的にまとめました。
![]() 執筆者:マヒロ |
|
Pythonの配列(リスト)スライスの基本知識と使い方
スライスとは、リストや文字列などのシーケンス型の一部分をコピーして、新しいオブジェクトを作成する仕組みです。
まずは、最も頻繁に使用される標準的な書き方と、ステップを指定する応用方法について確認しましょう。
基本的な書き方:[開始:終了]
スライスの基本は、[開始インデックス:終了インデックス] という形式で記述します。
重要な点は、終了インデックスで指定した位置の要素は含まれないというルールです。
# サンプル配列(リスト)の作成
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# インデックス2から5の手前までを抽出
sub_list = numbers[2:5]
print(f"numbers[2:5] の結果: {sub_list}")
# 開始を省略(最初から5の手前まで)
start_omitted = numbers[:5]
print(f"numbers[:5] の結果: {start_omitted}")
# 終了を省略(3から最後まで)
end_omitted = numbers[3:]
print(f"numbers[3:] の結果: {end_omitted}")
実行結果
numbers[2:5] の結果: [2, 3, 4]
numbers[:5] の結果: [0, 1, 2, 3, 4]
numbers[3:] の結果: [3, 4, 5, 6, 7, 8, 9]
ソースコードの解説
上記の例では、numbers[2:5] と指定することで、インデックス2(値は2)からインデックス4(値は4)までが取り出されています。
インデックス5の要素は含まれません。
また、開始や終了を省略することが可能で、[:5] ならば先頭から、[3:] ならば指定位置から末尾までを一度に取得できるため、コードの記述量を減らすことができます。
ステップ指定:コロン2つ [開始:終了:刻み]
スライスでは、3つ目の値として「ステップ(増分)」を指定することも可能です。
これにより、1つ飛ばしで要素を取得するといった操作が容易に行えます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 0から10の手前までを、2つ飛ばしで抽出
step_two = numbers[0:10:2]
print(f"2つ飛ばしの結果: {step_two}")
# すべての要素を3つ飛ばしで抽出
step_three = numbers[::3]
print(f"3つ飛ばしの結果: {step_three}")
実行結果
2つ飛ばしの結果: [0, 2, 4, 6, 8]
3つ飛ばしの結果: [0, 3, 6, 9]
ソースコードの解説
numbers[0:10:2] のように、コロンを2つ並べて最後に数値を加えることで、抽出する間隔をコントロールしています。
numbers[::3] という書き方は「最初から最後まで、3つおきに」という意味になり、非常に簡潔に特定のパターンを持つデータを抜き出すことができます。
後ろから抽出!マイナスインデックスを使ったスライス操作
Pythonの便利な点として、インデックスに負の値を指定できることが挙げられます。
これは、配列の長さが不明な場合や、末尾に近い要素を基準にしたい場合に威力を発揮します。
末尾からの指定方法
マイナスのインデックスは、末尾の要素を -1、その手前を -2 とカウントします。
これを利用して「後ろから◯件」という抽出が可能です。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 後ろから3つの要素を抽出
last_three = numbers[-3:]
print(f"後ろから3つ: {last_three}")
# 最初から、後ろから2つ目の手前までを抽出
except_last_two = numbers[:-2]
print(f"末尾2つを除く: {except_last_two}")
実行結果
後ろから3つ: [7, 8, 9]
末尾2つを除く: [0, 1, 2, 3, 4, 5, 6, 7]
ソースコードの解説
numbers[-3:] は、「インデックス-3(つまり値7)から最後まで」という意味になります。
numbers[:-2] は、「先頭からインデックス-2(値8)の手前まで」を抽出します。
データの最後の方にある不要なフッター行などを除外したい時に頻繁に使われるテクニックです。
配列を後ろから(逆順に)取得する方法
ステップ指定に -1 を使用すると、配列を逆順に並べ替えたコピーを簡単に作成できます。
numbers = [0, 1, 2, 3, 4, 5]
# 配列全体を逆順にする
reversed_list = numbers[::-1]
print(f"逆順の結果: {reversed_list}")
実行結果
逆順の結果: [5, 4, 3, 2, 1, 0]
ソースコードの解説
[::-1] は、開始と終了がデフォルト(全体)で、ステップが -1(逆方向に1つずつ)であることを示します。
reverse() メソッドとは異なり、元の配列を書き換えず(非破壊的)、逆順になった新しい配列を返すため、安全に処理を行うことが可能です。
2次元・多次元配列のスライス(リストとNumPyの違い)
現実のプログラム、特に画像処理や表データ分析では「2次元配列(行列)」を扱う機会が非常に多いです。
Python標準のリスト型と、専門ライブラリのNumPyでは、スライスの記述方法が大きく異なるため注意が必要です。
リスト型での2次元配列スライス
標準のリスト型(リストのリスト)の場合、カンマを使って縦と横を同時に指定することはできません。
# 3x3のリスト
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 0行目と1行目を取得
rows = matrix[0:2]
print(f"行のスライス: {rows}")
# 特定の列だけを抜き出したい場合はリスト内包表記などが必要
col_1 = [row[1] for row in matrix]
print(f"1列目のみ抽出: {col_1}")
実行結果
行のスライス: [[1, 2, 3], [4, 5, 6]]
1列目のみ抽出: [2, 5, 8]
ソースコードの解説
標準のリストで matrix[0:2] とすると、外側のリストに対するスライスとして機能し、行単位での抽出になります。
しかし、標準リストでは matrix[0:2, 1:2] のような書き方をするとエラーになるため、特定の「列」を抜き出すにはループやリスト内包表記を使わなければならず、コードがやや複雑になります。
NumPy配列(ndarray)でのスライス(カンマを使ったスマートな指定)
数値計算ライブラリ「NumPy」を使用すると、カンマ区切りで複数の次元を同時にスライスできます。
これが現在でもNumPyが必須とされる最大の理由の一つです。
import numpy as np
# 3x3のNumPy配列を作成
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 0〜1行目の、1〜2列目を抽出
# [行のスライス, 列のスライス]
sub_arr = arr[0:2, 1:3]
print("NumPyのスライス結果:")
print(sub_arr)
# 全行の、2列目だけを抽出
col_2 = arr[:, 2]
print(f"2列目のみ: {col_2}")
実行結果
NumPyのスライス結果:
[[2 3]
[5 6]]
2列目のみ: [3 6 9]
ソースコードの解説
NumPyでは、arr[行範囲, 列範囲] という形式で次元をまたいだ指定が可能です。
arr[:, 2] のように記述すると、すべての行(:)についてインデックス2の列だけを取り出す、といった非常に直感的な操作が実現します。
多次元配列になっても、カンマで区切って条件を増やしていくだけで対応できます。
スライスを使った配列要素の代入と削除
スライスはデータの取得だけでなく、配列の一部を「書き換える」際にも非常に役立ちます。
特定の範囲を別の値で一括置換(代入)
スライスした範囲に対して新しいリストを代入することで、その範囲の要素を一気に変更できます。
numbers = [0, 1, 2, 3, 4, 5]
# インデックス1から3(値1, 2)を書き換える
numbers[1:3] = [10, 20]
print(f"代入後の配列: {numbers}")
# スライスの範囲と代入するリストの長さが違ってもOK
numbers[1:3] = [100, 200, 300]
print(f"長さが違う代入: {numbers}")
実行結果
代入後の配列: [0, 10, 20, 3, 4, 5]
長さが違う代入: [0, 100, 200, 300, 3, 4, 5]
ソースコードの解説
左辺にスライスを指定して代入を行うと、その範囲が丸ごと右辺のリストに置き換わります。
面白い特性として、スライス範囲の長さ(例では2件分)と代入するリストの長さ(3件など)が異なっていても、Pythonが自動的に配列のサイズを調整してくれます。
スライスを使った要素の削除
スライス範囲に「空のリスト」を代入することで、その範囲の要素を削除できます。
numbers = [0, 1, 2, 3, 4, 5]
# インデックス2から4の手前までを削除
numbers[2:4] = []
print(f"削除後の配列: {numbers}")
# del文を使った削除も可能(推奨)
del numbers[0:2]
print(f"del文での削除: {numbers}")
実行結果
削除後の配列: [0, 1, 4, 5]
del文での削除: [4, 5]
ソースコードの解説
numbers[2:4] = [] とすることで、特定の範囲を消去できます。
実務上は、意図を明確にするために del numbers[2:4] という記述が使われることも多いですが、どちらも内部的には同様の処理が行われます。
応用編:sliceオブジェクトと複数条件の考え方
スライスをより高度に、あるいは再利用可能な形で扱うためのテクニックについても触れておきましょう。
sliceオブジェクトの作り方とメリット
実は、スライスの記法 [:] は、内部的に slice というオブジェクトを生成しています。
これを変数に格納しておけば、複数の配列に対して同じ条件のスライスを適用できます。
# スライス条件を定義(開始2, 終了5, ステップ1)
my_slice = slice(2, 5)
list_a = [10, 20, 30, 40, 50, 60]
list_b = ["a", "b", "c", "d", "e", "f"]
print(f"list_a への適用: {list_a[my_slice]}")
print(f"list_b への適用: {list_b[my_slice]}")
実行結果
list_a への適用: [30, 40, 50]
list_b への適用: ['c', 'd', 'e']
ソースコードの解説
slice(start, stop, step) 関数を使ってオブジェクトを作成できます。
このオブジェクトをインデックスの代わりに渡すことで、全く別のデータ群に対して一貫した「切り抜き」のルールを適用できるため、設定ファイルに基づいてデータを抽出するような汎用的なプログラムを書く際に便利です。
複数条件(フィルタリング)との使い分け
スライスはあくまで「位置(インデックス)」に基づいた抽出です。
「値が10以上のものだけを抜き出したい」といった「値の条件」で抽出したい場合は、リスト内包表記やNumPyのブールインデックス参照を使いましょう。
スライスと条件付き抽出を組み合わせることで、Pythonのデータ処理はより強力になります。
Pythonのスキルを活かして年収を上げる方法
以上、Pythonの配列におけるスライスを中心に解説してきました。
なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。


