我有一个词典列表。每个字典都有一些布尔标志。所以,列表看起来像 -
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循环?我有很多标志,组合会随着添加的每个新标志而增加 - 结果 - 代码只是丑陋。
答案 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])