我有4个整数变量
r1, r2, c1, c2
它们可以是任何整数值。我想找出其中的一个是-1
。
规则为r1
,并且r2
不能同时为-1; c1
和c2
不能同时为-1。
我可以使用if
语句,但这可能很麻烦:
if r1 == -1:
if c1 == -1:
# do action a
elif c2 == -1:
# do action b
else: # c1 and c2 are both not -1
# do action c
elif r2 == -1:
if c1 == -1:
# do action d
elif c2 == -1:
# do action e
else: # c1 and c2 are both not -1
# do action f
else: # none of the four integers is -1.
# do action g
能否请您教我一些更优雅,更有效的算法?
答案 0 :(得分:0)
我认为您在这里没有效率问题,但是您可以通过检查您明确提到的两种非法情况来提高可读性:
if r1 == -1 and r2 == -1:
raise Exception("r1 & r2 are -1")
elif c1 == -1 and c2 == -1:
raise Exception("c1 & c2 are -1")
else:
print("ok!")
您有一些选择可以完全避免if / else(例如,一个字典,其键为(r1, r2, c1, c2)
的元组,而您希望作为值调用的操作),但是我认为它们全都是可读性方面的净损失。
答案 1 :(得分:0)
根据您提到的规则,即r1 = r2 = -1和c1 = c2 = -1不会发生,我们可以假设在某些情况下,我们不需要执行所有四项检查来确定您的变量是否为-1。
为了利用这些规则,您需要具有一些反映变量顺序的数据结构,并能够跳过不需要的检查(例如,r1 = -1,而不需要检查r2)。
虽然这也许不是更有效的CPU时间方法,但它遵循的逻辑是,不必在每种情况下都执行所有变量检查:
d = {'r1' : 0, 'r2' : -1, 'c1' : -1, 'c2' : 0}
def isMinusOne(x):
if x == -1:
return x
i = 0
while i < len(d):
if isMinusOne(list(d.values())[i]) is not None:
print(list(d.keys())[i])
if i == 0 or i == 2:
i += 2
else:
i += 1
else:
i += 1