2016-01-10 5 views
6

0から100のリストを5つのステップで欲しければrange(0,105,5)を使うことができますが、range(0,101,5)も使用できます。除外された最後の数値で範囲を使用するPythonの方法?

正直言って、最後の数字を除外するのは直感的ではないので、これらのどちらも意味をなさない。

それ以外に、0から100までの5つのステップでリストを作成する "正しい"方法は何ですか?誰かが時間を持っていれば、最後の数字を除いてどのような場合にコードを読みやすくしますか?

+4

これは古いCSのものです:https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html – thebjorn

答えて

8

あなたがリストした2つの選択肢は似ていません。 1つはrange(start, stop+step, step)で、もう1つはrange(start, stop+1, step)です。彼らは同じことを返す必要はありません。彼らが行う唯一のケースは、stop - startstepで割り切れる場合です。

>>> start, stop, step = 0, 42, 5 
>>> range(start, stop+step, step) 
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45] 
>>> range(start, stop+1, step) 
[0, 5, 10, 15, 20, 25, 30, 35, 40] 

だからどちらを使用しますか?[開始、停止](両端を含む)が必要な場合は、範囲の最後にstop+1を使用します。 stop+1以上のものは、上記のような副作用があります。 range(0, 42+5, 5)には結果として45が含まれ、[0、42]の範囲には含まれません。あなたはそれについてどう思いますか?

1

range関数は次のように動作します。Pythonのドキュメントから

range(lowerBound, upperBound+step, step) 

i = lowerBound 
while True: 
    if(i < upperBound): 
     range_list.append(i) 
     i += step 
    else: 
     break 

これはなぜrange(0, 105, 5) == range(0, 101, 5)

とは、UpperBoundを除外するための正しい方法である

完全な形式は、単純な整数のリスト[start、start + step、 start + 2 * step、...]を返します。

1

5のステップで0から100までのリストを作成するための正しい方法は、このリストは100/5 == 20要素を有し、数100を含まない

range(0, 100, 5) 

あります。

カウントがゼロから開始すべきであり、間隔が長い時間前に(非常に?)ハーフオープンであるべき理由ダイクストラは、次のように説明しhttps://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

をPythonの範囲は、ダイクストラをたどり、ハーフオープンの間隔を使用しているので、それを作成することになります

range(0, 100+1, 5) # closed interval [0..100] by five 

をして、はい、私はそれはそれは珍しいので、生産コードでまさにそのように書かれて見ることが期待される:ハーフオープンの間隔過去1あなたは1を追加する必要があります。

+0

しかし彼は[0,100]ではなく[0,100]を望んでいます。 – jarmod

+0

@jarmod彼はおそらく(通常はバグですが)彼はそれを得る方法を含めました。 – thebjorn

1

基本的にあなたが上限値を含め、その後、あなたのコードでそれを使ってあなたの範囲の機能を定義することができます。

def range_with_stop(start, stop, step): 
    return range(start, stop + step, step) 

In [201]: print(list(range_with_end(0, 100, 5))) 
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100] 

EDIT

@によると、あなたがその機能を変更することができます答えるReti43 @ Reti43が範囲(0、40、5)を返すことを望んでいると言いましたので、以下のように考えています):

def range_with_stop(start, stop, step): 
    if stop//step == 0: 
     return(range(start, stop + step, step)) 
    else: 
     return(range(start, step * (stop//step), step)) 

In [265]: range_with_stop(start, 42, step) 
Out[265]: range(0, 40, 5) 

In [266]: range_with_stop(start, 45, step) 
Out[266]: range(0, 45, 5) 
1

range()関数呼び出しのパラメータに基づいてシーケンスのサイズを計算したい場合は、range(0,105,5)を使用する必要があります。次のことを考えてみましょう:そのトークンによって

len(range(0,6,1)) == 6 == 6/1

len(range(0,6,2)) == 3 == 6/2

len(range(0,6,3)) == 2 == 6/3

len(range(0,6,4)) == 1 == floor(6/4)

は、あなたが持っているでしょう

len(range(0,105,5)) == 21 == 105/5

関連する問題