Pythonで配列を複数個ごとに取り出す方法が知りたいんだ!

…という方のために、この記事を書きました。

 

ということでこんにちは、20代怠け者(@20sInvest)です!

Pythonの配列を、3つの要素ごととか、5つごとに取り出して出力したり、別の配列変数として取り出したい、という場合はどうしたらいいんでしょう?

 

例えばこの配列を3つの要素ごとに分割して…

["A","B","C","D","E","F","G","H","I","J"]

 

こうじゃ。

['A', 'B', 'C']
['D', 'E', 'F']
['G', 'H', 'I']
['J']

 

…こんな処理をしたくて色々ネットを検索してみたんですが…なかなか簡潔な方法がなかったので、その方法をシェアしておきますね。

たぶん、そのままコピペでOKです。

 

  今回使ったPythonのバージョンは以下の通りです。

  • Python: 3.8.1

【コード】配列を指定した数ごとに分割する仕組み

ということで、そのコードはこちらです。

#配列を用意
arr = ["A","B","C","D","E","F","G","H","I","J"]

#配列の要素数をカウント
length = len(arr)

#開始位置を指定
n = 0

#分割する変数の個数を指定
s = 3

#配列を指定した個数で分割していくループ処理
for i in arr:
	print(arr[n:n+s:1])
	n += s

	#カウント数が配列の長さを超えたらループ終了
	if n >= length:
		break

 

上記を実行すると、以下のような形で出力されます。

Printで出力してますが、もちろん別の配列変数に入れてもOKです。

数値でも文字列でも、問題なく分割出来ました。

['A', 'B', 'C']
['D', 'E', 'F']
['G', 'H', 'I']
['J']
[Finished in 0.2s]

【解説①】配列を分割する「スライス」の仕組み

どういう処理をしているのかを解説しますね。

まず、配列の分割には「スライス」という方法を使います。

配列名の後ろに[0:3:1]といった形で数値を指定していくと、配列をその数値に沿ってスライスして、取り出すという操作です。

 

スライスの記述方法は以下の通り。

[開始位置:終了位置:増分]

 

例えば、今回用意した配列を3つごろに分割したい場合は、こんな感じで指定していくことになります。

print(arr[0:3:1])  #['A', 'B', 'C']
print(arr[3:6:1])  #['D', 'E', 'F']
print(arr[6:9:1])  #['G', 'H', 'I']
print(arr[9:12:1]) #['J']

 

1つ目の場合、開始位置は0で、3番目(の前)まで取り出す。

そして、その間の配列は全部取り出したいので増分は1にする、といった具合ですね。

この辺はちょっとこんがらがりやすいので、自分で実際に数字をいれてどんな感じでスライスされるのか出してみたほうがイメージしやすいかと。

 

【解説②】ループ処理でスライスしていく

この仕組みがわかれば、後はループ処理で配列をスライスしていけば済むだけの話ですね!

開始位置用の変数と、何個(要素)ごとに分割するかどうかを指定する変数を用意して、For文でループしてます。

#開始位置を指定
n = 0

#分割する変数の個数を指定
s = 3

#配列を指定した個数で分割していくループ処理
for i in arr:
	print(arr[n:n+s:1])
	n += s

 

ただこれだけだと、分割し終わった後もループが続いてしまって、なんだか見苦しいです。

['A', 'B', 'C']
['D', 'E', 'F']
['G', 'H', 'I']
['J']
[]
[]
[]
[]
[]
[]
[Finished in 0.1s]

 

なので、配列の要素数をあらかじめカウントしておいて、その数を超えたらループ処理を終了する、という記述を書いてます。

#配列の要素数をカウント
length = len(arr)
#配列を指定した個数で分割していくループ処理
for i in arr:
	print(arr[n:n+s:1])
	n += s

	#カウント数が配列の長さを超えたらループ終了
	if n >= length:
		break

まとめ

配列を指定した数ごとに分割する方法の、ザックリとした解説はこんな感じです!

ひとまずぼくの環境では動いているので「まあいいか!」と思ってシェアしちゃったんですが、「もっとスマートな方法があるよ」という方は、ぼくのツイッターにでも、一言コメントいただければ嬉しいです!

 

ということでご参考までに。

それでは!