如何在python中修改实际变量列表

时间:2016-01-28 13:48:56

标签: python python-2.7 python-3.x

我想对对象列表做同样的事情。我可以在所有3个上面调用一个函数,如:

x = double(x)
y = double(y)
z = double(z)

但即使按照前现代标准,这似乎也很可怕。我做了

In [4]: z = 0

In [5]: x = 0

In [6]: y = 0

In [7]: items = [x, y, z]

In [8]: for item in items:
   ...:     item = 5
   ...:     

In [9]: print(x)

0

并且没有骰子。你如何操作变量列表,我正在阅读getattr并且它似乎对我不起作用

我希望在这种情况下迭代x,y和z,并在两行代码中将它们全部设置为等于5 - 对于项目中的项目,然后修改每个项目

现在,我得到奇怪的行为,就像所有项目彼此直接相等:

In [11]: for item in items:
    print item is x
   ....:     
True
True
True


In [12]: for item in items:
    print item is y
   ....:     
True
True
True

我实际上并不想要一个列表,我希望它们保留在同一个名称的内存中,以便我可以立即执行:

return {'income': income, 'ex_date': exdate, ...}

我没有提供足够的信息,但这是目标,所有4个都必须单独处理:

    total_income = self.get_total_income(portfolio_id)
    short_term = get_short_term(distros, 'ST')
    long_term = get_lt(distros, 'LT')
    total_distributions = self.get_totals(portfolio_id)
    items = [total_income, short_term, long_term, total_distributions]
    for item in items:
        do the same thing
    return {'total_income': total_income, 'short_term': short_term, 'long_term': long_term, 'total_distributions': total_distributions}

5 个答案:

答案 0 :(得分:4)

你的循环的问题在于你所做的只是为名称item分配5,但从不对原始列表做任何事情。

要修改列表(或者更确切地说,获取修改后的值的新列表),您可以使用列表推导或map函数对列表的所有元素进行操作。

>>> items = [0, 0, 0]
>>> [float(x) for x in items]
[0.0, 0.0, 0.0]
>>> map(float, items)
[0.0, 0.0, 0.0]

另一个例子:

>>> items = [1,2,3]
>>> [x*10 for x in items]
[10, 20, 30]
>>> map(str, items)
['1', '2', '3']

编辑以回应您对该问题的评论:

  是的,我昨天用过一些。我实际上并不想要一个列表,我希望它们留在内存中使用相同的名称

在这种情况下,使用字典作为数据结构而不是n个单独的变量。例如:

>>> my_values = {'x': 1, 'y': 2, 'z':3}
>>> my_values['y']
2

您可以使用字典理解按给定规则修改所有值。

>>> my_values = {key:value*2 for key, value in my_values.items()}
>>> my_values
{'y': 4, 'x': 2, 'z': 6}

答案 1 :(得分:2)

在这里,您甚至不需要使用列表推导。在您的特定情况下,这就足够了:

 x = y = z = 5

答案 2 :(得分:2)

如果您希望变量保留在具有相同名称但具有不同值的内存中,您可以执行以下操作:

[x, y, z] = [5 for _ in items]

[x, y, z] = [double(i) for i in items]

答案 3 :(得分:1)

怎么样?

 x = 1
 y = 2
 z = 3
 l = [x, y, z]
 l = [i**2 for i in l]
 x, y, z = l

 print(x, y, z)
 1 4 9

答案 4 :(得分:1)

  

如何操作变量列表

一般来说,你没有。如果您要将值作为列表进行操作,则将它们存储在不在单个变量中的列表中。或者您可以将它们存储为字典中的项目或对象的属性,只是不要将它们放在单独的变量中。

对于您询问的具体案例,您可以这样做:

x, y, z = map(double, [x, y, z])

或您的其他示例:

total_income = self.get_total_income(var)
short_term = get_short_term(var)
long_term = get_lt(var)
total_distributions = self.get_totals(var)
items = [total_income, short_term, long_term, total_distributions]
result = {
    'total_income': total_income,
    'short_term': short_term,
    'long_term': long_term,
    'total_distributions': total_distributions
}
# N.B. Using list(...) to avoid modifying the dict while iterating.
for key, value in list(result.items()):
    result[key] = do_something(value)
return result