0

たとえば、いくつかの条件式の代わりにブール代数を使用したい

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

私がやりたいことは

def simple(x,y):
    return x#y

合計 12 の方程式があります。# はブール演算子である (x#y) を直接返したいだけです。幸運にも関係を見つけた小さな問題にこれを行いました。この場合も同じようにしたいのですが、どうすればいいですか?

複数の if 条件を通過しないため、パフォーマンスが向上しますか? これは通常の慣行ですか?

サンプル:

 x    y   output
 1    2     3
 1    3     2
 1    4     5
 1    5     4

ここでは単純なビット単位の xor ゲートで十分です

def(x,y): return x^y
4

3 に答える 3

2

条件と同じ値を生成する適切な式を見つけることはできますが、そのようなコードは読みにくく、保守が難しくなります。

より良い解決策は、入力値でインデックス付けできるネストされたリストまたは辞書を使用することです。このようにして、コードをマッピングの明確かつ迅速な表現であるデータに変換し、容易に理解でき、将来的に簡単に変更できます。

于 2011-12-17T23:43:11.477 に答える
1

上記のロジックのより簡潔な式を見つけようとすることが、より読みやすいコードにつながるかどうかはわかりません。おそらくそうではありません。ただし、ロジックをそのまま、より数学的な定式化に作り直すことができます。

def boo(x, y):
    p = (x, y)
    return (1 if p in ((3, 4), (4, 2)) else
            2 if p == (4, 1) else
            3 if p == (5, 1) else
            4 if p == (3, 1) else
            None)

別のオプションは、辞書を使用することです。

def boo(x, y):
    return {(3,4):1, (4,2):1, (4,1):2, (5,1):3, (3,1):4}.get((x, y), None)

すべての値が指定されたケースに一致することがわかっている場合は、 の[(x, y)]代わりに書くことができます.get((x, y), None)

于 2011-12-17T23:56:02.150 に答える
0

辞書の使用を検討できます。おそらく、辞書の辞書を作成し、関数に辞書から値を取得させることができます。

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

def boodict(x,y):
    d1 = {3: {1:4, 4:1} ,4: {1:2, 2:1},5: {1:3}}
    try:
        value = d1[x][y]
    except KeyError:
        value = None
    return value
于 2011-12-18T00:22:53.837 に答える