Python - 如何在满足不同条件时从变量中进行选择

时间:2013-10-09 12:31:26

标签: python variables random numpy

我想知道是否有人可以帮我解决python编程问题。我有5个数字(0,2,30,180,356)并想随机选择一个条件

delayVariable=[0,2,30,180,365]
delayCondition = random.choice(delayVariable)

每次我想随机选择数字,直到满足另一个条件。例如,当选择“365”20次时,我不再希望它选择那个条件,而是应该从[0,2,30,180]生成随机数,如果已选择“30”,则再次生成20次I也希望将其排除,因此应从[0,2,180]生成随机数。我希望这种情况继续下去,直到没有数字为止。

提前谢谢


谢谢你,这些答案正是我所需要的。更复杂的问题是当满足另一个条件时,可能在该数字被选中20次之前发生。然而,我仍然希望停止选择那个数字。例如:

如果condition1 =“off”,那么我不再希望选择“0”,如果condition2 =“off”,那么我不再希望选择“2”等....

3 个答案:

答案 0 :(得分:4)

使用计数器。

import collections
import random

delays=[0,2,30,180,365]

counter = collections.defaultdict(int)
while delays:
    condition = random.choice(delays)
    print(condition)
    counter[condition] += 1
    if counter[condition] == 20:
        delays.remove(condition)

该程序计算选择列表中每个元素的频率。达到阈值(此处为20)时,元素将被删除。

如果要在达到阈值之前根据条件从列表中删除元素,则有两个选项。首先,您可以将此条件的计数器值设置为阈值。该元素将被代码中的remove删除。第二个 - 在我看来更好的方法 - 是从列表中删除元素。如果元素不再存在,则无法选择。问题解决了。

答案 1 :(得分:4)

你的问题相当于从数组中挑选不同的元素[二十“365”,二十“30”,......]。我们可以使用random.sample从数组中获取不同的元素。

>>> random.sample([0,2,30,180,365] * 20, 80)
[0, 2, 180, 180, 2, 0, 180, 30, 365, 365, 30, 30, 30, 365, 30, 0, 365, 365, 2, 0, 
 30, 2, 365, 30, 180, 180, 180, 0, 30, 180, 365, 180, 0, 2, 365, 0, 0, 30, 180, 30, 30, 
 2, 365, 2, 180, 30, 0, 2, 2, 0, 0, 30, 30, 0, 180, 2, 2, 365, 180, 365, 2, 2, 2, 365, 
 30, 30, 0, 0, 180, 30, 30, 30, 0, 365, 365, 0, 365, 30, 2, 180]
>>> collections.Counter(_) # check that we have no more than twenty "30"s, etc.
Counter({30: 20, 0: 16, 2: 15, 365: 15, 180: 14})

答案 2 :(得分:2)

将它们用作词典

delayVariable={0:50,2:50,30:50,180:50,365:50} 

所以在每次有选择之后你可以减小它的值直到它为0,使用if来检查它是否为0然后从dict中弹出它。

如果您希望使用if语句,那么这是一个优雅的解决方案,但每次延迟都会是if!所以这不是一个明确的方法,但它会起作用。