2012-04-29 98 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