Python 在给定多个布尔变量的情况下,快速找到真布尔值的方法?

Python 在给定多个布尔变量的情况下,快速找到真布尔值的方法?,python,Python,假设你有10个变量,其中一个为真,另一个为假。除了有大量的if/elif语句外,还有没有更好的方法来找出哪个变量是真的,然后根据哪个变量是真的来“做点什么”呢?根据哪个变量为真,每个“某物”都会有所不同。首先,您可以将值存储在列表中,而不是存储在单独的变量中: l = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10] print l.index(True) 如果v1为真,则打印0,如果v2为真,则打印1,依此类推 然而,这并不能解决如何处理不同变量的不同行为的

假设你有10个变量,其中一个为真,另一个为假。除了有大量的if/elif语句外,还有没有更好的方法来找出哪个变量是真的,然后根据哪个变量是真的来“做点什么”呢?根据哪个变量为真,每个“某物”都会有所不同。

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

l = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10]
print l.index(True)
如果
v1
为真,则打印
0
,如果
v2
为真,则打印
1
,依此类推

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

fns = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10]
fns[l.index(True)]() # call the appropriate function
这是否可以被认为是对拥有大量
elif
块的改进,实际上取决于与
f1
f10
相关联的代码量

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以外的任何和,则列表中的
True
值太少或不够。

是的,有。应该是这样的:

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]()

这将允许您根据变量的值检索和调用函数。与另一个答案不完全相同,但极为相似。这是从其他语言模拟<代码>开关语句的标准方法。

任何时候,当你有很多变量时,你想根据一个条件来选择它们,你应该考虑使用一个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")()

所以您想在不使用if/elif的情况下实现独占决策树吗?为什么???我只是想知道有没有更好的方法。拥有大量的if/elif行是最好的方法吗?所有的“something”是否足够相似,可以将它们表示为一个函数?如果您需要十个不同的代码块来处理十个不同的变量,我看不出您将如何改进If/elif?这会对答案产生真正的影响,这正是我要描述的方法。我反复使用它来模拟其他语言的
开关
功能。谁说Python不使用大括号?你真的不需要dict,所以我将其更改为列表。@agf大括号仅用于Python中的dict,而不是其他语言(如Java)中常见的方法开始/结束标志。