Python-2つの値の間の数値でリストを作成しますか?


355

入力した2つの値の間の値でリストを作成するにはどうすればよいですか?たとえば、次のリストは11〜16の値に対して生成されます。

list = [11, 12, 13, 14, 15, 16]

回答:


643

を使用しrangeます。Python 2.xではリストを返すので、必要なのは次のとおりです。

>>> range(11, 17)
[11, 12, 13, 14, 15, 16]

Python 3.xではrangeイテレータです。だから、あなたはそれをリストに変換する必要があります:

>>> list(range(11, 17))
[11, 12, 13, 14, 15, 16]

:2番目の数値は排他的です。だから、ここでそれは16+1= である必要があります17

編集:

ずつ増加についての質問に対応するために0.5、最も簡単なオプションは、おそらく使用することですnumpyののを arange()して.tolist()

>>> import numpy as np
>>> np.arange(11, 17, 0.5).tolist()

[11.0, 11.5, 12.0, 12.5, 13.0, 13.5,
 14.0, 14.5, 15.0, 15.5, 16.0, 16.5]

1
驚くばかり!まさに私が探していたもの!1だけではなく0.5などの小さい値でインクリメントする方法もありますか?だから[
11.0、11.5、12.0

2
@lorde 3番目のstepパラメーターを使用して1を超えてインクリメントできますが、それは浮動小数点数ではなくintです。標準のlibではそれを正確に行うことはできません。
Jared

@Jared間隔を置いて値をドロップしてリストを作成できますか?[1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]のように

2
Python 2.xおよび3.xについて説明するのに適しています。
Sigur

numpyが望ましくない状況で作業している場合は、(上記のようにx = 11、y = 17、およびstep = 0.5)を検討してください:a_range = [x] + [x +(step * i)for i in range(int ((yx)/ step))]
TheLoneDeranger

23

あなたが探しているようですrange()

>>> x1=11
>>> x2=16
>>> range(x1, x2+1)
[11, 12, 13, 14, 15, 16]
>>> list1 = range(x1, x2+1)
>>> list1
[11, 12, 13, 14, 15, 16]

0.5代わりにでインクリメントするには1、次のように言います。

>>> list2 = [x*0.5 for x in range(2*x1, 2*x2+1)]
>>> list2
[11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]

ちょっとしたちょっとしたひねり。最初のコードブロックではlist、変数として使用します。
ヘビとコーヒー

2
Python listでは組み込みクラスであるため、変数としての使用はやや推奨されていません
Snakes and Coffee

x * increment、しかし2 * startvalueはどういう意味ですか?説明していただけますか?
サントーササンディ2017

7

試してください:

range(x1,x2+1)  

これはPython 2.xのリストであり、Python 3.xのリストとほとんど同じように動作します。Python 3を実行していて、変更可能なリストが必要な場合は、次を使用します。

list(range(x1,x2+1))

5

float型で機能する関数のような範囲を探しているなら、ここに非常に良い記事があります。

def frange(start, stop, step=1.0):
    ''' "range()" like function which accept float type''' 
    i = start
    while i < stop:
        yield i
        i += step
# Generate one element at a time.
# Preferred when you don't need all generated elements at the same time. 
# This will save memory.
for i in frange(1.0, 2.0, 0.5):
    print i   # Use generated element.
# Generate all elements at once.
# Preferred when generated list ought to be small.
print list(frange(1.0, 10.0, 0.5))    

出力:

1.0
1.5
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5]

3

Pythonでリスト内包表記を使用します。リストにも16が必要なので、x2 + 1を使用します。範囲関数は、関数の上限を除外します。

list = [x for x in range(x1、x2 + 1)]]


1
range()リスト内包表記を使用する必要がない場合
Billal Begueradj 2018

@BillalBegueradj Python3では、range()はリストの代わりにジェネレータのようなオブジェクトを返します。これは基本的にPython 2のxrange()と同じです。リスト内包表記は必要ないのは当然です。list()組み込み関数の方が簡単ですlist(range(x1, x2+1))
Mike Housky

3

xからyまでの範囲にしたい場合

range(x,y+1)

>>> range(11,17)
[11, 12, 13, 14, 15, 16]
>>>

3.xサポートのリストを使用


2

Pythonではこれを非常に簡単に行うことができます

start=0
end=10
arr=list(range(start,end+1))
output: arr=[0,1,2,3,4,5,6,7,8,9,10]

または、指定された数までの配列を返す再帰関数を作成できます。

ar=[]
def diff(start,end):
    if start==end:
        d.append(end)
        return ar
    else:
        ar.append(end)
        return diff(start-1,end) 

出力:ar = [10,9,8,7,6,5,4,3,2,1,0]


0

これを行う最もエレガントな方法はrange関数を使用することですが、このロジックを再作成したい場合は、次のようなことができます。

def custom_range(*args):
    s = slice(*args)
    start, stop, step = s.start, s.stop, s.step
    if 0 == step:
        raise ValueError("range() arg 3 must not be zero")
    i = start
    while i < stop if step > 0 else i > stop:
        yield i
        i += step

>>> [x for x in custom_range(10, 3, -1)]

これは出力を生成します:

[10, 9, 8, 7, 6, 5, 4]

以前に@Jaredによって表現されたように、最善の方法はrangeまたはを使用numpy.arrangeすることですが、共有したいコードは興味深いと思います。


list(custom_range(10,3,1))は空のリストを返します。
Denis Rasulev、2018年

実際、[x for x in range(10, 3, 1)]最初の引数は開始、2番目は終了、最後はステップです。==>停止>開始
Michael

0

上記のすべての答えは、範囲が正の数値のみであることを前提としています。オプションのステップ値(デフォルト= 1)を設定する可能性がある、引数が任意(正または負)の連続番号のリストを返すソリューションは次のとおりです。

def any_number_range(a,b,s=1):
""" Generate consecutive values list between two numbers with optional step (default=1)."""
if (a == b):
    return a
else:
    mx = max(a,b)
    mn = min(a,b)
    result = []
    # inclusive upper limit. If not needed, delete '+1' in the line below
    while(mn < mx + 1):
        # if step is positive we go from min to max
        if s > 0:
            result.append(mn)
            mn += s
        # if step is negative we go from max to min
        if s < 0:
            result.append(mx)
            mx += s
    return result

たとえば、標準のコマンドlist(range(1,-3))は空のリストを返しますが、[]この関数は[-3,-2,-1,0,1]

更新:ステップがマイナスになる可能性があります。コメントをありがとう、@ Michael。


1
これは、あなたのステップがポジティブであることを前提としています。
Michael

@マイケル、良い点。私はコードを更新したので、今では否定的なステップを持つことができます:)
Denis Rasulev

@tgikal、そうです。しかし、関数の引数に割り当てられる値がわからず、戻り値をソートする必要がある場合はどうでしょうか。
Denis Rasulev、2018

組み込みの範囲関数を使用して達成できないカスタム関数の追加機能はありません。現在の例は基本的にi_min = -3, i_max = 1 any_number_range(i_max, i_min))返されるため、改善の例は素晴らしいと思いますが[-3,-2,-1,0,1] 、組み込みlist(range(i_min, i_max + 1))は同じ値を返します。
tgikal

シーケンスが減少している場合は、負のステップを使用してみてくださいlist(range(1,-3, -1))
Juan AntonioRoldánDíaz19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.