Python中if-else执行的随机顺序

时间:2010-10-15 22:04:29

标签: python random

这可能听起来像一个奇怪的问题,但请耐心等待......

我在Python中有一个字典,其值如下:

'B': 23.6
'D': 0.6
'F': 35.9
'H': 35.9

我需要对这些值执行if-else以执行不同的操作,具体取决于哪个> 30.我现在的代码是:

if angles['B'] > 30:
  # Do stuff
elif angles['D'] > 30:
  # Do other stuff
elif angles['F'] > 30:
  # Do different stuf
elif angles['H'] > 30:
  # Do even more different stuff

现在问题来自于我有两个或更多相同的值(如上面的示例数据中所示)。在这种情况下,我想随机选择其中一个使用。问题是:我如何在Python中做到这一点?请记住,不管字典的值是什么(如果它们都是< 30)或者只应该做一件事。

4 个答案:

答案 0 :(得分:11)

您可以创建一系列键/值对:

pairs = angles.iteritems()

过滤它以删除元素< = 30:

filtered = [(name, value) for name, value in pairs if value > 30]

检查是否有任何选项

if filtered:

然后选择一个:

    from random import choice
    name, value = choice(filtered)

更新添加了以下内容......

正如亚伦在评论中提到的那样,这只会让你到达那里。您仍然需要根据name编制您要采取的操作。

Aaron建议使用包含函数的字典。基本上,您可以定义一些函数来执行您的名称/值对

def thing1(name, value):
    # do stuff...
def thing2(name, value):
    # do different stuff...

设置字典映射名称到函数调用

routes = {'A': thing1,
          'B': thing2,
          'C': thing1}

并定义一个分派到适当函数的路由函数:

def route(pair):
    name, value = pair
    return routes[name](name, value)

然后,您只需使用route获得的名称/值对来致电choice,例如

result = route(choice(filtered))

更结构化的方法可能涉及创建一个类来处理所有这些或仅仅是路由方面。

答案 1 :(得分:2)


from random import choice

while angles:
    x = choice(angles.keys()) 
    if angles.pop(x)>30:
        if x == 'B':
            # Do stuff
        elif x == 'D':
            # Do other stuff
        elif x == 'F':
           # Do different stuf
        elif x == 'H':
           # Do even more different stuff
        break

答案 2 :(得分:1)

编写一个函数来扫描字典......

def has_gt_30(d):
    for key, value in d.items():
        if value > 30:
            return key
    return False

angle = has_gt_30(angles_dict)
if angle:
    do_stuff(angle)

这不会随机选择一个,但会任意挑选一个。如果您真的想要一个随机的,请将“返回键”替换为符合条件的键聚合并返回。然后使用random.choice

答案 3 :(得分:1)

你也可以这样做:

import random

angles = {'B':23,
'D': 2.6,
'F': 35.9,
'H':35.9
}

keys = angles.keys()

random.shuffle(keys) # shuffle the list of dictionary keys

for key in keys:
   if angles[key] > 30:
      # ...
      break