4

Python でコードを書いていると、ときどき次のシナリオが発生します。

ループを繰り返すと、後で使用するために変数の中間値をリストに格納する必要があることがわかりました。以下は非常に基本的なサンプル コードです。

for x in range(0,10):
    y = x*x
    temp_list.append(y)

問題はtemp_listまだ宣言されていないことです。したがって、通常はループの先頭に移動してから、次を追加します。

temp_list = []
for x in range(0,10):
    y = x*x
    temp_list.append(y)

これは些細なことのように思えるかもしれませんが、リストが存在しない場合はリストを作成して値を追加するか、存在する場合は追加するだけの Pythonic な方法があるかどうか疑問に思っていました。

4

4 に答える 4

8

非常に基本的なサンプルでは、​​リスト内包表記を使用して実行できます。

l = [x*x for x in range(0, 10)]
于 2012-11-12T08:29:48.633 に答える
4

変数が宣言されているかどうかは常に明確でなければなりません。他にどのようにアクセスしますか?

動的にできることは、dict エントリです。

a = {}

for x in range(0,10):
    y = x*x
    a.setdefault('temp_list', []).append(y)

a['temp_list']必要な場合にのみ作成されます。

于 2012-11-12T08:32:14.553 に答える
2

あなたの問題に応じて、そのような構造を扱う良い「pythonic」方法は、それをジェネレーターに抽象化することです。あなたの些細な例のために:

def squares():
    for x in range(0,10):
        y = x*x
        yield y

それで:

temp_list = [i for i in squares()]

多くの場合、そのような一時リストが必要になるのは、データに対して一連の操作を実行しており、それぞれに別のループが含まれているためです。代わりにジェネレーターを使用すると、結果が 1 つのループだけになるため、パフォーマンスとメモリ使用量の両方を大幅に改善できます。

些細な例の場合、通常はジェネレーター式を書く方が簡単であることに注意してください。

temp_list = (x*x for x in range(0, 10))

あまり Python らしくない方法が必要な場合は、locals 辞書を編集できますが、難読化されたコードにつながるため、これは実際には良い考えではありません。

for x in range(0, 10):
    y = x*x
    locals().setdefault('temp_list', []).append(y)
于 2012-11-12T09:03:27.627 に答える