2012-04-29 96 views
8

我想隨機化一個已初始化爲完整的rubik多維數據集(所有顏色位於正確的兩側)。我有移動旋轉立方體的函數。我想隨機選取50個函數來正確地隨機化它。在Python中使用字典代替Case/Switch語句

我正在做這個項目,以學習更多關於Python的知識,因爲我大多數人都在做C++,而且我看到沒有Python/switch的情況,所以我正在嘗試一個字典。當我做了字典,代碼似乎執行出於某種原因:

def random_cube(self): 
    scramble = { 0 : self.up_turn(), 
        1 : self.down_turn(), 
        2 : self.left_turn(), 
        3 : self.right_turn(), 
        4 : self.front_turn(), 
        5 : self.back_turn(), 
        6 : self.up_turn("inverted"), 
        7 : self.down_turn("inverted"), 
        8 : self.left_turn("inverted"), 
        9 : self.right_turn("inverted"), 
        10: self.front_turn("inverted"), 
        11: self.back_turn("inverted") 
       } 
    for x in range(50): 
     i = random.randint(0,11) 
     scramble[i] 

所以,當我做這本詞典,它似乎通過運行和執行出於某種原因(我認爲)所有11項。我似乎無法找到更好的方法,至少比長的if/elif字符串更優雅。

!編輯:實現這兩個建議,函數的(「倒置」)標誌不是由任何建議設置。例如,調用1和7都給我down_turn,但輸出顯示該標誌沒有設置時,它應該已在第7號。

任何想法?

+1

作爲設計筆記,有真的只有兩個不同的舉動人們可以在魔方上做。其餘的只是一個如何定位臉的問題。編寫如下所示的函數可能會更容易:'def rotate(face,clockWise = True):'也可以使用dict和for for循環替代列表並使用'random.choice'從中選擇。 – 2012-04-29 04:03:06

+0

從列表random.choice,我修好了。我把函數調用放在一個列表中,並嘗試過,但對我來說並不適用...另外,我設置了多維數據集,以便始終將白色視爲「前」。我不認爲這是表示它的最好方法:\ – 2012-04-29 04:29:15

回答

15

當你定義字典時,它實際上是調用函數,並將返回值存儲在字典中。爲了讓字典存儲對函數的引用,您需要刪除尾部括號。所以像這樣:

scramble = { 0: self.up_turn, 
       1: self.down_turn, 
       etc. 

然後,在底部,請致電scramble[i]()

這將調用沒有參數的函數。爲了處理將「倒置」作爲參數傳遞的情況,可以定義單獨的函數,如up_turn_inverted()等,也可以讓字典存儲由函數和參數組成的2-ple,然後調用東西喜歡scramble[i][0](scramble[i][1])

從建議更新評論: 你也可以使用lambda表達式來定義函數,特別是需要參數的函數。這基本上等同於定義一個up_turn_inverted函數,但作爲匿名函數就地完成。它應該是這樣的:

6: lambda: self.up_turn("inverted") 
7: lambda: self.down_turn("inverted") 

+3

另一種選擇是使用'lambda:'創建反向調用。 – Amber 2012-04-29 03:59:24

+0

或者內聯條件怎麼樣?即'scramble [i](())如果我<6 else(「inverted」))' – 2012-04-29 04:09:01

+1

作爲一般原則,對字典排序進行假設似乎是應儘可能避免的事情。我會爲lambda解決方案投票。 – happydave 2012-04-29 04:12:31

2

我相信這就是所謂的「功能一流的價值」,這意味着最重要的,你可以通過標識符指功能參數等功能。

當您定義您的字典時,Python解釋器會評估這些函數並將這些值存儲在字典中。爲了把這個關閉,直到您產生隨機數,嘗試而不是存儲在自己的功能在你的字典出處,通過不使用括號:在呼喚你的功能循環,你必須在

def random_cube(self): 
    scramble = { 0 : self.up_turn, 
        1 : self.down_turn, 
        2 : self.left_turn, 
        3 : self.right_turn, 
        4 : self.front_turn, 
        5 : self.back_turn, 
        6 : self.up_turn, 
        7 : self.down_turn, 
        8 : self.left_turn, 
        9 : self.right_turn, 
        10: self.front_turn, 
        11: self.back_turn 
       } 

然後您的正常和倒置的情況下,區分由你傳遞的參數:

for x in range(50): 
     i = random.randint(0,11) 
     if i <= 5: 
      scramble[i]() 
     else: 
      scramble[i]("inverted") 

或者更簡單地說:

for x in range(50): 
     i = random.randint(0,11) 
     scramble[i](() if i < 6 else ("inverted")) 
+0

感謝您的回覆。我沒有想到解釋者必須評估才能把字典價值放進去。 – 2012-04-29 05:33:19