2011-12-17 81 views
0

我想使用的,而不是幾個條件語句布爾代數,例如而不是使用幾個if語句我想用一個布爾代數,

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),其中#是布爾運算符。我做了這個小問題,我幸運地找到了一個關係。我也想在這種情況下也做同樣的事,我該如何處理呢?

這是否有任何性能增益,因爲它沒有經過幾個條件? 這是正常的做法嗎?

樣本:

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

這裏簡單的按位異或門會做

def(x,y): return x^y 
+0

您能否提供關於您的關係性質的更多細節?很難說如何在不知道約束條件的情況下對數學問題的表示進行數學優化。與使用嵌套的「字典」相比,可能有一種更加優雅的方式來做到這一點,但是對於玩具問題,通常情況下,我們需要準確理解您可以或不可以期待的內容。 – 2011-12-18 00:08:20

+0

我正在尋找一個使用智能操作來做這件事的一般程序..我記得在一個本科電子課上做這種問題..病更新一個小例子的問題..我的直覺感覺說一定有一些程序向後並找到關係..我只是好奇..看起來像使用一個dictioary是在一般情況下更優雅的方式 – syllogismos 2011-12-18 00:43:20

+0

我不能想象當你的輸入不是布爾值時,你期望如何使用布爾代數。至於如何找到關係,那麼......如果你不知道關係,那麼你如何知道12個單獨輸入的正確答案? – 2011-12-18 00:50:53

回答

1

我不知道是否試圖找到上面的邏輯的terser表達式會導致更多的可讀代碼;可能不會。但是你可以返工的邏輯,是一個更數學公式:

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)

+0

實際上有12個關係,所以使用字典是一個更清潔的方式 – syllogismos 2011-12-18 00:53:32

2

您可以找到產生相同的值作爲你的條件語句合適的表情,但這樣的代碼變得難於閱讀並保持。

更好的解決方案是使用嵌套列表或字典,您可以使用輸入值進行索引。通過這種方式,您可以將代碼轉換爲數據,這種數據可以清晰快速地表示您的映射,並且可以在將來輕鬆理解和輕鬆修改。

+0

這是一個謎題,沒有人會讀它除了我..使用字典是有道理的感謝..但我也很好奇如何找出關係 – syllogismos 2011-12-18 00:00:23

+0

如果你真的想這樣做,那麼你有一些可能性。一個涉及到所有的條件,用int()把它們變成整數,乘以預期的結果並且總結所有的選擇。只有一個選擇會產生非零結果。另一種方法是利用多項式。你會搜索一個多項式,爲每個輸入產生正確的結果。你可以通過編寫一個多項式係數的聯立方程組來開始這個過程,然後你會寫一個表達式來使用係數來計算結果。詞典雖然是你的朋友! – 2011-12-18 00:13:16

+0

我記得在做這樣的問題時,如果你有八位輸入和預期的輸出,你設計一個邏輯門......所以我就這樣問了第一個問題......我在一個謎題中遇到了這個問題看起來像一個簡單的前瞻性問題,我想不出以任何其他方式優化它:( – syllogismos 2011-12-18 00:52:20

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