根据真值表分配分数,而不使用if-else结构

时间:2012-01-25 14:40:07

标签: python

我有一个词典列表。每个字典都有一些布尔标志。所以,列表看起来像 -

listA = [{key1: somevalue1, key2:somevalue2, flag1:True, flag2:False, score:0},
         {key1: somevalue3, key2:somevalue4, flag1:False, flag2:True, score:0},
         ...
         {key1: somevalue(N-1), key2:somevalueN, flag1:True, flag2:False, score:0}] 

假设我有一张表,根据标志值的组合分配分数。它就像一个二进制真值表:

flag1 True True False False
flag2 True False True False
score 1 2 3 4

我现在想要遍历列表,并根据它们指定的组合将这些分数分配给列表中的每个字典。是否有一种优雅的方式来做,而不是if else循环?我有很多标志,组合会随着添加的每个新标志而增加 - 结果 - 代码只是丑陋。

2 个答案:

答案 0 :(得分:3)

您可以使用字典:

scores = {(True, True): 1, (True, False): 2, 
          (False, True): 3, (False, False): 4}

现在,只需查看scores[flag1, flag2]即可找到分数。

要在整个列表中执行此操作,请使用

for d in listA:
    d["score"] = scores[d["flag1"], d["flag2"]]

答案 1 :(得分:0)

假设你有一个函数f来分配这些分数(在上面的例子中你的表现并不明显)给定一个标志列表,那么你可以这样做:

for myDict in myList:
    score = f(myDict['flag1], myDict['flag2'])

如果你想将它推广到任意数量的标志:

def score(L):
    """ This function takes a list of bools and returns a score. 
    In this case, the score is simply the number of bools that are True """

    return sum(L)


listA = [{key1: somevalue1, key2:somevalue2, flag1:True, flag2:False, score:0},
     {key1: somevalue3, key2:somevalue4, flag1:False, flag2:True, score:0},
     ...
     {key1: somevalue(N-1), key2:somevalueN, flag1:True, flag2:False, score:0}]

for d in listA:
    print "The score of", d, "is:", \
        score([f for f,b in d.iteritems() if type(b) == bool])