-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)用更少的行编写转换()?

将它们放入可迭代中不起作用:

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 回答