2012-01-25 6 views
0

私は辞書のリストを持っています。各辞書には特定のブール値フラグがあります。したがって、リストは次のようになります。if-else構文を使用せずに真理値表に基づいて得点を割り当てる

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 

。 elseループの代わりに、それを行うエレガントな方法がありますか?私はたくさんのフラグを持っていますが、新しいフラグが追加されるたびにその組み合わせが増えます - 結果 - コードはちょっと醜いです。

答えて

3

あなたはこのために辞書を使用することができます。

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

今、あなたは、単にscores[flag1, flag2]を検索することで、スコアを見つけることができます。

は、フラグのリスト与えられた(それは明らかではありませんあなたは、上記の例ではそれを行う方法)、リスト全体でこれを行うあなたはこれらのスコアを割り当てる機能fがあるとし

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

ああ。これは簡単に見えます!ありがとう!! :) – sneha

0

使用するにはあなたが行うことができます。

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