【问题标题】:Python - how do you select from variables when different conditions are metPython - 满足不同条件时如何从变量中进行选择
【发布时间】:2013-10-09 12:31:25
【问题描述】:

我想知道是否有人可以帮助我解决 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 次,我再次还希望将其排除在外,因此应从 [0,2,180] 生成随机数。我希望这一直持续到没有数字为止。

提前谢谢你


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

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

【问题讨论】:

  • 有多少个数字?如果它只有 100 个,只需创建一个包含 20x0、20x2 等的列表,将其随机播放,然后从该列表中弹出元素。

标签: python variables random numpy


【解决方案1】:

使用计数器。

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 删除。第二种——我认为更好的方法——是从列表中删除元素。如果元素不再存在,则无法选择它。问题解决了。

【讨论】:

  • 谢谢这些答案正是我所需要的。更复杂的问题是当满足另一个条件时,这可能发生在该数字被选择 20 次之前。然而,我仍然希望停止选择该号码。例如:如果 condition1="off" 那么我不再希望选择 "0",如果 condition2="off" 那么我不再希望选择 "2" 等等......
  • 非常感谢您的帮助,但我似乎无法让它工作。因为这段代码在一个更大的循环中,我希望代码记住哪个被删除并且只提供一个数字。我只能让这段代码作为一个单独的部分工作,输出所有数字。就像您在编辑中建议的那样,我只想在条件成立后永久删除该变量,但允许脚本的其余部分继续
  • 你必须知道什么时候会发生什么。初始化您使用数据初始化列表的计数器。其他一切都发生在循环中。
【解决方案2】:

您的问题相当于从数组 [20 个“365”,20 个“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})

【讨论】:

    【解决方案3】:

    将它们用作字典

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

    所以每次选择后,您可以将值减小到 0,使用 if 检查它是否为 0,然后从字典中弹出它。

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

    【讨论】:

    • 灵活方法的好主意。
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多