web-dev-qa-db-ja.com

Python 3が範囲をリストに変える

数字1-1000を含むリストを作成しようとしています。明らかに、これは書き込み/読み取りが煩わしいので、範囲を指定してリストを作成しようとしています。 Python 2の場合:

some_list = range(1,1000)

うまくいくはずですが、Python 3では範囲はPython 2のxrangeに似ていますか?

誰でもこれについての洞察を提供できますか?

121
Boathouse

範囲オブジェクトからリストを作成するだけです:

my_list = list(range(1, 1001))

これは、python2.xのジェネレーターでも同様です。通常、リストは必要ありませんが、my_list[i]の値をより効率的に取得できるため(i + 1)、繰り返し処理する必要がある場合は、rangeにフォールバックできます。

また、python2.xでは、xrangeは引き続きインデックス可能です。1。これは、python3.xのrangeにも同じプロパティがあることを意味します2

1print xrange(30)[12]はpython2.xで動作します

2に類似した声明 1 python3.xではprint(range(30)[12])であり、それも機能します。

151
mgilson

python 3.xでは、range()関数は独自の型を取得しました。この場合、イテレータを使用する必要があります

list(range(1000))

21

Pythons <= 3.4では、他の人が示唆したように、list(range(10))を使用して範囲外のリストを作成できます(一般的に、反復可能)。

Pythonの3.5にアンパックの一般化を導入した別の方法は、リストリテラル*[]を使用することです。

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

これはlist(r)と同等ですが、リテラル構文であり、関数呼び出しが含まれていないという事実により、より高速に実行できます。ゴルフをコーディングする必要がある場合は、文字数も少なくなります:-)

Python3に範囲リストを直接取得する機能がない理由は、元のPython3デザイナーがPython2の初心者であったためです。彼はforループでのrange()関数の使用のみを考慮したため、リストを展開する必要はありません。実際、リストを作成して関数に渡すには、range()関数を使用する必要が非常に頻繁にあります。

したがって、この場合、Python3はPython2に比べてあまり便利ではありません。

  • Python2には、xrange()およびrange();があります。
  • Python3では、range()とlist(range())があります

それでも、この方法でリスト展開を使用できます。

[*range(N)]
8
xuancong84

リストで1〜1000の数字を使用する必要はありません。ただし、何らかの理由でこれらの数値が本当に必要な場合は、次のようにすることができます。

[i for i in range(1, 1001)]

簡潔にリスト内包表記:

上記のリストの理解は、次のように翻訳されます。

nums = []
for i in range(1, 1001):
    nums.append(i)

これはリスト内包構文にすぎませんが、2.xからです。私はこれがPython 3で動作することを知っていますが、アップグレードされた構文もあるかどうかはわかりません

範囲は最初のパラメーターを含めて始まります。ただし、最後まで含まない 2番目のパラメーター(2つのパラメーターを指定した場合、最初のパラメーターを省略すると、「0」から始まります)

range(start, end+1)
[start, start+1, .., end]
8
inspectorG4dget

Python 3では Range を使用します。

以下は、2つの数字から数字の間に戻る関数の例です。

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

結果

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]
1
Rajiv Sharma

実際、これはPython2と比較したPython3のレトログラデーションです。確かに、range()とxrange()を使用するPython2は、それぞれlist(range())とrange()を使用するPython3よりも便利です。その理由は、Python3の元の設計者はあまり経験がなく、多くの初心者がメモリとCPUの両方が非効率な多数の要素を反復処理するために範囲関数を使用することのみを考慮したためです。しかし、彼らは数値リストを作成するために範囲関数の使用を無視しました。今、彼らがすでに元に戻すには遅すぎます。

私がPython3のデザイナーになる場合、次のことを行います。

  1. irangeを使用してシーケンス反復子を返します
  2. lrangeを使用してシーケンスリストを返す
  3. rangeを使用して、シーケンス反復子(要素数が大きい場合、たとえばrange(9999999))またはシーケンスリスト(要素数が小さい場合、たとえばrange(10))を返す

それが最適なはずです。

0
xuancong84