連番のリスト作成の関数 range
今回は連番のリストを作るための関数 range に関しての解説です。
まずはどういうものかというと、0から9までの整数のリストを作りたい時、関数を使わずにやろうとすると、こうなります。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
まぁ10くらいまでなら頑張って作ってもいいかなと思うのですが、これが100とか1000とかまでの連番を作るときはめんどくさいですよね。
それを関数でやらせようというのが、range関数です。
まずは一番簡単に使う方法を紹介します。
a = range(10)
print(a)
実行結果
range(0, 10)
これで0から9まで10個の数字でリストが作られました。
でもリストの形になっていないですよね。
リストの形で表示したい場合は、list()をつけてあげます。
a = range(10)
print(list(a))
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
上の例ではlist()をprint関数の方に付けましたが、range(10)に付けても大丈夫です。
a = list(range(10))
print(a)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
この場合、リストのインデックスと同様、0から開始されることに注意してください。
この連番のリストは一体どこで使うでしょうか?
rangeを使う場面
個人的によく使うのは、あるリストに対して、その要素数の回数だけある処理をしたい時に使っています。
words = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
for w, i in zip(words, range(len(words))):
print("index : " + str(i) + " word : " + w)
実行結果
index : 0 word : a
index : 1 word : b
index : 2 word : c
index : 3 word : d
index : 4 word : e
index : 5 word : f
index : 6 word : g
index : 7 word : h
index : 8 word : i
index : 9 word : j
上の例では一気に色々出てきたので、ちょっと解説。
まずはfor文です。
これは繰り返しの関数でしたね。
また「in」の後にあるzipは複数のリストを同時に繰り返す場合の関数でした。
range(len(words))は、まずlen(words)で、wordsに含まれる要素の数を取得しています。
その後、range関数で、要素数に対する整数の連番のリストを作成しています。
次のprintの行で、表示させるのですが、range(len(words))で作成した連番のリストを1つずつ i に代入し、表示させています。
ただし、print関数で他の文字列も表示させているため、データ型があっていないため、str()で数値を文字列へと変換しています。
また + を用いて、文字列を連結しています。
個人的にはこの使い方をすることが多い気がしますが、色々なところに使える関数なので、覚えておいて損はないです。
rangeの範囲を指定する場合
でも0からの連番でないけども、連番が欲しい場合があることでしょう。
例えば、3から10までの連番が欲しい時、そんなときは2つの数値をrange関数に入れることで作ることができます。
a = list(range(3, 10))
print(a)
実行結果
[3, 4, 5, 6, 7, 8, 9]
3と10を入れると、3から10までと勘違いしてしまいがちですが、実際には3から10−1までのリストが作成されます。
飛び飛びの連番を作成する場合
連番といっても、飛び飛びの連番が欲しい場合もあるでしょう。
飛び飛びの連番という日本語が正しいか分からないですが、2、4、6、8、10とか2、5、7、9、11とかの連番のことです。
その場合は、さらに何個飛びかという数字をrange関数に追加します。
a = list(range(3, 20, 2))
print(a)
実行結果
[3, 5, 7, 9, 11, 13, 15, 17, 19]
これで3から19まで1個飛びの数字のリストが得られます。
2個飛びにする場合は、最後の数字を3にします。
a = list(range(3, 20, 3))
print(a)
実行結果
[3, 6, 9, 12, 15, 18]
これで飛び飛びの連番のリストを自由自在に作ることができます!と言いたいところですが、実はこのrange関数が使えるのは整数だけです。
小数を入れるとエラーが表示されます。
開始の数字を少数にしてみます。
a = list(range(3.5, 20, 3))
print(a)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
----> 1 a = list(range(3.5, 20, 3))
2
3 print(a)
TypeError: 'float' object cannot be interpreted as an integer
次に終わりの数字を少数にしてみます。
a = list(range(3, 20.5, 3))
print(a)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
----> 1 a = list(range(3, 20.5, 3))
2
3 print(a)
TypeError: 'float' object cannot be interpreted as an integer
最後に何個飛びかという数字を少数にしてみます。
a = list(range(3, 20, 3.5))
print(a)
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
----> 1 a = list(range(3, 20, 3.5))
2
3 print(a)
TypeError: 'float' object cannot be interpreted as an integer
少数の連番を作成したい場合は、また他の関数を使う必要がありますが、それはまた今度紹介することにします。
とりあえずrange関数に関してはこんな感じです。
次回は数値計算ライブラリ numpyに関して解説をしていきます。
ということで今回はこんな感じで。
コメント