我知道关于循环数和随机数也有一些类似的问题,但我似乎找不到解决问题的方法。
假设我有一个来自数据集的固定数字列表,以及该数字必须满足的阈值:
x = (7,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41)
threshold= 25
我需要从这个列表中随机选择一个数字。不幸的是,我不能直接循环浏览我的原始列表,我必须首先随机选择列表的索引,然后找到我的号码。例如,如果我现在随机生成一个索引号1
,那么我得到x[1]
,它是11
我需要的最终结果是找到至少3次大于阈值的数字,然后将所有结果放入列表中,然后我的循环就可以停止了。(索引不能重复(。例如,可能的最终结果是(27,29,31)
(结果可以是任何格式(。我想也许可以开始这样的事情,但真的需要帮助才能继续:
除非您特别关心创建额外过滤列表的内存使用情况,否则最简单的方法可能是从以下操作开始:
filtered = [i for i in x if i > threshold]
然后,您可以从此筛选列表中选择三个样本(在import random
之后(。以下人员可能会多次选择同一项目:
random.choices(filtered, k=3)
或者如果你想避免多次选择同一项:
random.sample(filtered, k=3)
上述每个函数都将输出一个列表。如果需要将输出转换为元组,请在输出上使用tuple(....)
。
首先进行澄清。您需要在每次迭代时从列表中选择一个随机元素,还是每次都需要从列表中挑选一个不同的随机元素。也就是说,同一个索引可以被选取两次吗?你在做后者。
其次,您希望使用range(len(x))
。您不希望将x
的长度硬连接到代码中,并且希望索引0成为可能。CCD_ 9可能是更好的选择。
最后,你想做一些类似的事情:
result = []
for ....
if select >= threshold:
result.append(select)
if len(result) >= 3: break
如果我们假设以下约束:
- 我们不允许循环浏览原始列表(包括列表理解(
- 我们一次只能通过原始列表的索引访问一个成员
- 我们必须从列表中选择3个大于或等于阈值的不同成员
以下代码应满足所有要求:
x = [ 7,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41 ]
threshold = 25
result_index = []
while len(result_index) < 3:
index = random.range(0, len(x))
if x[index] >= threshold and index not in result_index:
result_index.append(index)
result = [ x[a] for a in result_index ]
以下是它的工作原理:
- 在循环中,我们存储索引,而不是数字本身
- 对于每个指数,我们检查2个条件:有一个数字大于或等于阈值,我们以前从未见过这个指数
- 如果条件满足,我们保存索引,而不是数字
- 重复,直到我们有3个索引
- 通过直接从这些索引中获取数字来构建新的列表