-1

私の質問は、コーディング スタイルに関するものです。手順を次のような複数の変数に適用したい場合:

from pylab import vstack     # the function to apply to many variables
v1 = range(5)      # some dummy variables
v2 = range(9)
...
v20 = range(8)

# now, I want to apply a function to all variables that changes them!
v1 = vstack(v1)   # I really do not need the "old" v1 anymore
v2 = vstack(v2)
...
v20 = vstack(v20)

これらは 20 行のほぼ同じコードです。変換 ( vx = vstack(vx)) をより少ない行で記述する方法はありますか?

それらを iterable に入れてもうまくいきません:

all_v = [v1, v2, v3, .... , v20]
for v in all_v:
    v = vstack(v)

type (v1) # -> v1: <type: list>
4

2 に答える 2

0

そもそも、それらを別々の変数にする必要がありますか? それは通常、コードの匂いです。それらをリストに保持するか、名前が重要な場合は辞書に入れ、それを更新します:

my_data = {}
my_data['v1'] = range(5)
my_data['v2'] = range(9)
...etc...

my_data = {k: vstack(v) for k, v in my_data.iteritems()}
于 2013-04-08T12:27:49.173 に答える
0
from pylab import vstack
parameters = (5, 9, ..., 8)

v = [vstack(range(p)) for p in parameters]

parametersこれにより、関数へのパラメーターを含むタプルでリスト内包表記が実行されますrange。そのタプルの各パラメーターについて、関数の結果がrange関数に渡されvstackます。結果はリストにまとめられます。

したがってv[0]、パラメータ値parameters[0]などの結果に対応します。

vループ内で変数をローカルに上書きしていたため、コードでは機能しませんでした。これにより、元のリストの項目が変更されることはありません。これらの結果から(新しい)リストを作成したい場合は、次を使用できますlist.append

all_v = [v1, v2, v3, .... , v20]
new_v = []
for v in all_v:
    new_v.append(vstack(v))
于 2013-04-08T12:28:02.337 に答える