4

Pythonの1行ループは、リストの作成にのみ使用できますか?(つまり、リスト内包表記)、またはより一般的なコンピューティングに使用できますか?

たとえば、Pythonでのリスト内包表記(〜単一行ループ)を知っています。

my_list = [ 2*i for i in range(10)]

複数行のループで構築することもできます。

my_list = []
for i in range(10):
    my_list.append(2*i)

しかし、一般的な複数行のループを常に1行のループに変換できますか?

たとえば、次の複数行のforループがあるとします。

my_array = np.ones(10*10)

for x in range(10):
     my_array[x,:] = 0

それを単一行ループに変換できますか?より一般的には:

Q1。2つの形式は機能的に同等ですか?(つまり、同じ一連の操作/操作をサポートします)

Q2。Pythonの1行ループがベクトル化される前に読んだと思います。これは本当ですか?これは、複数行のループよりも高速に反復できることを意味しますか?

4

2 に答える 2

5

しかし、Pythonの一般的な複数行ループを常に1行ループに変換できますか?

簡単な答えはノーです。

リスト内包表記は、投影(マッピング)やフィルタリングに適しています。

たとえば、次のようなコードがある場合:

result = []
for x in seq:
    if bar(x):
        result.append(foo(x))

次に、ご指摘のとおり、リスト内包表記として書き直すことでメリットが得られます。

result = [foo(x) for f in seq if bar(x)]

ただし、リスト内包表記は、通常、この射影またはフィルタリングパターンに適合しない操作にはあまり適していません。

たとえば、要素を変更する必要があるが結果は必要ない場合、リスト内包表記は適切ではありません。次のコードは、リスト内包表記として記述するのは不便です(両方のメソッドがを返すと仮定しますNone)。

for x in seq:
    x.foo()    # Modify x
    x.bar()    # Modify x again

一部の操作は、理解の中で許可されていません。例として、条件が満たされた場合にループから早期に抜け出すことがあります。

for x in seq:
    if x.foo():
        break
    else:
        x.bar()
于 2012-12-03T23:02:39.280 に答える
2

私が指摘することの1つは、リストだけでなく、理解力を使用してセットや辞書を作成できることです。

>>> {i**2 for i in range(5)}
set([0, 1, 4, 16, 9])
>>> {i : str(i) for i in range(5)}
{0: '0', 1: '1', 2: '2', 3: '3', 4: '4'}

また、リスト内包append、 (例のように)何度も使用するよりも一般的に高速ですappend。これは、追加のPythonレイヤーを持つ、とは対照的に、基になるCコードによって理解が行われるためです。

もちろん、理解には他の何よりも限界があります。リスト/セットの各要素に対してより多くの操作セットを実行する場合は、通常のループの方が適切な場合があります。

于 2012-12-03T23:06:28.387 に答える