リスト
前回、Pythonで小数を10進数として正しく扱うことができるDecimalモジュールを紹介しました。
今回は1次元リストの要素を指定した個数ずつに分割した2次元リストに変換する方法を紹介します。
それでは始めていきましょう。
リストの要素を指定した個数に分割
リストの要素を指定した個数に分割した2次元リストに変換するには、for文とリストの範囲指定を用います。
step = 50
a = range(1000)
output = []
for i in range(0, len(a), step):
output.append(a[i:i+step])
print(output)
実行結果
[range(0, 50), range(50, 100), range(100, 150), range(150, 200),
range(200, 250), range(250, 300), range(300, 350), range(350, 400),
range(400, 450), range(450, 500), range(500, 550), range(550, 600),
range(600, 650), range(650, 700), range(700, 750), range(750, 800),
range(800, 850), range(850, 900), range(900, 950), range(950, 1000)]
この方法ではfor文で繰り返しを指定する際にrange関数で3つ目の引数を指定して飛び飛びの値のリストを作成しています。
その部分だけ抜き出すとこんな感じです。
step = 50
a = range(1000)
print(*range(0, len(a), step))
実行結果
0 50 100 150 200 250 300 350 400 450 500 550 600
650 700 750 800 850 900 950
ここでは「*(アスタリスク)」を使ってアンパックしています。
これで飛び飛びの値で繰り返しが行われます。
次に一度に取得する範囲を「a[i:i+step]」とすることで、指定した個数の要素を取得して、新たなリスト(ここではoutput)に格納しています。
こうすることで指定した個数ずつに分割した2次元リストが作成できます。
ちなみに分割したい個数と元のリストの個数がぴったりでないことが多々ある、というよりもそちらの方が場合としては多いでしょう。
その場合、今回の方法で分割すると最後は分割していって余った分のリストとなります。
step = 33
a = range(1000)
output = []
for i in range(0, len(a), step):
output.append(a[i:i+step])
print(output)
実行結果
[range(0, 33), range(33, 66), range(66, 99), range(99, 132),
range(132, 165), range(165, 198), range(198, 231), range(231, 264),
range(264, 297), range(297, 330), range(330, 363), range(363, 396),
range(396, 429), range(429, 462), range(462, 495), range(495, 528),
range(528, 561), range(561, 594), range(594, 627), range(627, 660),
range(660, 693), range(693, 726), range(726, 759), range(759, 792),
range(792, 825), range(825, 858), range(858, 891), range(891, 924),
range(924, 957), range(957, 990), range(990, 1000)]
この例の場合、33個ずつ分割していって、最後のリストは「range(990, 1000)」と余った11個の要素で構成されています。
最後を余りでまとめてしまって良ければいいのですが、余りでまとめて欲しくない場合は、if文を使い、余りが出ない場合のみ分割するというような仕組みが必要です。
例えばこんな感じです。
step = 33
a = range(1000)
output = []
if len(a)%step != 0:
print("The reminder is not zero!")
else:
for i in range(0, len(a), step):
output.append(a[i:i+step])
print(output)
実行結果
The reminder is not zero!
忘れた頃にリストを指定した数ごとに分割したいなという場面が何度か出てきたので備忘録的にまとめてみました。
次回はNumPyでndarrayの要素をソートするsort関数を紹介します。
ではでは今回はこんな感じで。
コメント