在给定几个布尔变量的情况下,快速找到真正的布尔值?

时间:2011-07-20 15:29:17

标签: python

假设您有10个变量,其中一个变为真,其他变量为假。除了有大量的if / elif语句之外,是否有更好的方法来查找哪个变量为真,然后根据哪个变量为真做“某事”?根据哪个变量为真,每个“东西”都会有所不同。

4 个答案:

答案 0 :(得分:4)

bools = [False, False, False, True, False]
# we're using constants here but you can use variables

# find first True value
whichbool = bools.index(True)

# now call a function based on that value
[func0, func1, func2, func3, func4][whichbool]()

如果可能没有True值或多个值,您可能需要检查此值。检查这两种情况的最简单方法是使用sum()函数。 True作为整数是1,因此如果您获得除1之外的任何总和,则列表中的True值太少或不够。

答案 1 :(得分:1)

首先,您可以将值存储在列表中而不是存储在单独的变量中:

l = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10]
print l.index(True)

如果0为真,则会打印v1,如果1为真,则会v2,依此类推。

然而,这并不能解决如何处理不同变量的不同行为的问题。如果您发现if - elif - ...令人反感,您可以为十个案例中的每个案例调用一系列函数。

fns = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10]
fns[l.index(True)]() # call the appropriate function

这是否可以被视为比拥有大量elif块的改进实际上取决于与f1 ... f10相关联的代码量。

答案 2 :(得分:1)

是的,有。它是这样的:

def func1():
  print "function 1"

def func2():
  print "function 2"

def func3():
  print "function 3"

lookup = {'val1': func1, 'val2': func2, 'val3': func3}

toCall = 'val2'

lookup[toCall]()

这将允许您根据变量的值检索和调用函数。与其他答案不完全相同,但非常相似。这是从其他语言模拟switch语句的标准方法。

答案 3 :(得分:0)

任何时候你有很多变量,而你想根据条件选择它们,你应该考虑改用dict。

bools['a'] = False
bools['b'] = False
bools['c'] = True

for k, v in bools.iteritems():
    if v:
        print "The true variable is", k

使用变量名称,您可以按名称调用函数:

class MyHandlers(object):
    def a_is_true(self):
        # do something because of a

    def b_is_true(self):
        # do something because of b

handler = MyHandlers()
handler.getattr(k + "_is_true")()