重複の可能性:
Python decimal range() ステップ値
次のようなリストを生成したいと思います。
[0, 0.05, 0.1, 0.15 ... ]
range(0, 1, 0.05)は素晴らしいでしょうが、次の理由で機能しません。
range() 整数のステップ引数が必要ですが、float を取得しました。
エレガントなアイデアはありますか?;)
重複の可能性:
Python decimal range() ステップ値
次のようなリストを生成したいと思います。
[0, 0.05, 0.1, 0.15 ... ]
range(0, 1, 0.05)は素晴らしいでしょうが、次の理由で機能しません。
range() 整数のステップ引数が必要ですが、float を取得しました。
エレガントなアイデアはありますか?;)
numpyを使用できる場合は、を使用することをお勧めしますnumpy.linspace
。range
numpy自身を含め、浮動小数点数にロジックを適合させようとする関数はarange
、通常、終了境界がリストに含まれるかどうかに関して混乱します。linspace
開始点、終了点、および必要な要素数を明示的に指定することで、これをエレガントに解決します。
>>> import numpy
>>> numpy.linspace(0.0, 1.0, 21)
array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 ,
0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85,
0.9 , 0.95, 1. ])
Python 3では、rangeはジェネレーター(不変シーケンス)を返します...したがって、次のような非常に単純な関数を定義できると思います。
def frange(start,stop, step=1.0):
while start < stop:
yield start
start +=step
それで:
for x in frange(0, 1, 0.05):
print(x)
Pythonはトリッキーである必要はありません。
リストが必要な場合は、次の電話番号に電話してください。
list(frange(0,1,0.05))
または、関数を変更して、リストをすぐに返します。
乗算または他の処理を行う1行のソリューションを使用できますが、開始値と終了値が異なると注意が必要になる場合があります。このような範囲を頻繁に使用する場合は、関数を使用して再利用するだけです。コード上で何度も繰り返されるワンライナーでさえ悪いです。
またはこれはどうですか:
[v*0.05 for v in range(0,int(1/0.05))]
これはどう:
temp = range(0,100,5) # 0,5,10,...,95
final_list = map(lambda x: x/100.0,temp) # becomes 0,0.05,0.10,...,0.95
あまりエレガントではありませんが、きちんと機能させることに悩んだことはありません。また、ステップサイズが合理的である場合にのみ機能します。利点は、その場で実行するのに十分な速さであるということです。
より一般的でエレガントなソリューションについては、OPへのコメントを参照してください。
どうしたの
[i/100.0 for i in range(0, 100, 5)]
? 必要な桁数 (ここでは 2 つ) を確認し、適切な乗数 (1 は 100 になり、0.05 は 5 になります) を計算します。