我的问题是关于编码风格:当我想将一个过程应用于几个变量时,例如:
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>
答案 0 :(得分:0)
你真的需要他们在单独的变量中开始吗? N#39; s通常是代码味道。如果名称很重要,我会将它们保存在列表或字典中,并更新:
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()}
答案 1 :(得分: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))