pythonのrange関数で数字を飛ばして取得したい場合の方法。規則的なケースと不規則なケース

programming python

pythonには、連続した数字のオブジェクトを作るための組み込み関数、range関数が用意されています。
range関数は、引数として指定した値の範囲での連続した数値を要素として保持するrangeオブジェクトを生成する関数です。

python2とpython3では同じrange関数でも仕様が全く違いますので注意しましょう!(python2でのxrange関数がpython3のrange関数に相当)
ここではpython3を前提としたrange関数の基本的な使い方と、連続した数値のうち一部を飛ばしてオブジェクトを取得したい場合の方法を解説します。

スポンサーリンク

range関数の基本的な使い方

range関数は、引数として指定した開始数(start)から終了数(stop)までの連続した数値を要素とする、rangeオブジェクトを生成します。
range関数を使うときの書式はこのような形になります。

range(start, stop[, step])

この場合「startの数値から順にstepの数値を足していき、stopの数値をオーバーしない範囲での連続した数値を要素とする」rangeオブジェクトを生成します。
なおstart、stepについては省略が可能です。
startを省略した場合はデフォルトで0が、stepを省略した場合はデフォルトで1が指定されます。

実際の文例と生成されるオブジェクトの対応は次のとおりです。

range(6)
–> 0 1 2 3 4 5
range(1, 4)
–> 1 2 3
range(4,10,2)
–> 4 6 8

なお生成するrangeオブジェクトの数値は降順にすることも可能で、その場合はstepの数値に負の値を指定します。

range(6,0,-1)
–> 6 5 4 3 2 1
range(0, -6, -2)
–> 0 -2 -4
スポンサーリンク

range関数で規則的に数値を飛ばしていく方法

ここまで見ていただければ分かる通り、連続した数値の中から規則的に一部の数値を飛ばすのは簡単です。
引数step(デフォルトで1)に1以外の数を設定すれば、規則的に数値を飛ばしていくことができます。

例えば1~100のうち、3の倍数以外を飛ばしたrangeオブジェクトを取得したい場合は

range(3,100,3)
–> 3 6 9 12 …

となります。

range関数はfor文での繰り返しに使うことが多いと思いますので、forを使った例文を作ると次のような形になります。

for n in range(3,101,3):
print(n)

この場合、3、6、9、・・・と順にprintされていきます。
(引数stopが101になっているのは、100だと範囲として99までしか含まれないからです)

スポンサーリンク

range関数で対応できない or 飛ばしたい数値が不規則なケース

まず、規則的であってもrange関数では対応できないケースがあります。
例えば1~100のうち、3の倍数を飛ばしたrangeオブジェクトを取得したい場合。

取得したい数値は1、2、4、5、7、・・・ですが、これをrange関数単体で実現するのは困難です。
例えばこのようにせざるを得ないでしょう。

for n in range(1,101):
if(n mod 3 != 0):
print(n)

また一部の数値を不規則に飛ばしたい場合も、range関数単体ではできません。
例えば1~10のうち7だけ飛ばしたいといった時は、次のように書かざるを得ないでしょう。

for n in range(1,11):
if(n != 7):
print(n)
スポンサーリンク

まとめ

range関数で一部の数値を飛ばしたオブジェクトを生成する場合、具体的なケースによってできるものとできないものがあります。
range関数単体ではできないパターンの場合は、力技になってしまいますがif文などを組み合わせて処理していくのが良いでしょう。

コメント