检查多个值并更改它们

时间:2017-05-20 16:33:36

标签: python

Heyo大家,我有一个问题。

我有三个变量,rF,tF和dF。 现在这些值的范围可以从-100到+100。我想检查所有这些,看看它们是否小于1;如果是,请将它们设置为1。

这样做的简单方法就是3个if语句,比如

if rF < 1:
    rF = 1
if tF < 1:
    tF = 1
if dF < 1:
    dF = 1

然而,正如你所看到的,这看起来很糟糕,如果我有,说这些值中的50个,这可能很容易失控。

我试着把它们放在一个像这样的数组中:

for item in [rF, tF, dF]:
if item < 1:
  item = 1

然而,这不起作用。我相信当你这样做时你会创建一个完全不同的对象(数组),当你更改项目时,你不是改变变量本身而是改变数组的值。

所以我的问题是:这样做的优雅方式是什么?

4 个答案:

答案 0 :(得分:3)

为什么不使用字典,如果你只有三个变量要跟踪?

rF, tF, dF = 100, -100, 1

d = {'rF': rF, 'tF': tF, 'dF': dF}

for k in d:
    if d[k] < 1:
        d[k] = 1

print(d)
{'rF': 100, 'tF': 1, 'dF': 1}

然后,如果您稍后引用任何这些值,您可以简单地执行此操作(作为一个简单的示例):

def f(var):
    print("'%s' is equal to %d" % (var, d[var]))

>>> f('rF')
'rF' is equal to 100

如果您真的想使用列表,并且您知道列表的顺序,则可以执行此操作(但字典是针对此类问题制作的):

arr = [rF, tF, dF]
arr = [1 if x < 1 else x for x in arr]

print(arr)
[100, 1, 1]

请注意,列表推导方法实际上不会更改rFtFdF的值。

答案 1 :(得分:1)

你可以简单地使用字典,然后解压缩字典:

d = {'rF': rF, 'tF': tF, 'dF': dF}

for key in d:
    if d[key] < 1:
        d[key] = 1

rF, tF, dF = d['rF'], d['tF'], d['dF']

您可以使用以下内容代替最后一行:

rF, tF, dF = map(d.get, ('rF', 'tF', 'dF'))

答案 2 :(得分:1)

这就是你要求的:

rF = -3
tF = 9
dF = -2

myenv = locals()

for k in list(myenv.keys()):
    if len(k) == 2 and k[1] == "F":
        myenv[k] = max(1, myenv[k])

print(rF, tF, dF)
# prints 1 9 1

这可能会意外地修改您不想改变的任何变量,因此我建议使用正确的数据结构而不是破解用户环境。

修改:修复了RuntimeError: dictionary changed size during iteration的错误。字典不能通过同时修改进行迭代。首先复制字典键,然后迭代原始键而不是实际字典,避免这种情况。现在应该在Python 2和3中工作,之前只需要Python 2。

答案 3 :(得分:0)

使用列表理解和max功能。

items = [-32, 0, 43]
items = [max(1, item) for item in items]
rF, tF, dF = items
print(rF, tF, dF)