避免在python中使用多个相似的行

时间:2013-04-08 12:23:16

标签: python coding-style

我的问题是关于编码风格:当我想将一个过程应用于几个变量时,例如:

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>

2 个答案:

答案 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))