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
然而,这不起作用。我相信当你这样做时你会创建一个完全不同的对象(数组),当你更改项目时,你不是改变变量本身而是改变数组的值。
所以我的问题是:这样做的优雅方式是什么?
答案 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]
请注意,列表推导方法实际上不会更改rF
,tF
和dF
的值。
答案 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)