Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,重新生成一个随机索引,直到索引元素满足条件n次_Python_Python 3.x_List - Fatal编程技术网

在python中,重新生成一个随机索引,直到索引元素满足条件n次

在python中,重新生成一个随机索引,直到索引元素满足条件n次,python,python-3.x,list,Python,Python 3.x,List,我知道关于循环和随机数也有一些类似的问题,但我似乎找不到解决问题的方法 假设我的数据集中有一个固定的数字列表,以及该数字必须满足的阈值: 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

我知道关于循环和随机数也有一些类似的问题,但我似乎找不到解决问题的方法

假设我的数据集中有一个固定的数字列表,以及该数字必须满足的阈值:

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)
或者,如果要避免多次选择同一项目:

random.choices(filtered, k=3)
random.sample(filtered, k=3)

上述每个函数都将输出一个列表。如果需要将输出转换为元组,请在输出上使用
元组(..)

首先需要澄清。您是否需要在每次迭代中从列表中选择一个随机元素,或者每次都需要从列表中选择一个不同的随机元素。也就是说,同一个索引可以选取两次吗?你在做后者

其次,要使用
范围(len(x))
。您不希望将
x
的长度硬连接到代码中,您希望索引0成为可能
random.shuffle()
可能是更好的选择

最后,您要执行以下操作:

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 ]
    
    x=[7,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41]
    阈值=25
    结果_索引=[]
    而len(结果指数)<3:
    索引=随机范围(0,len(x))
    如果x[index]>=阈值和索引不在结果索引中:
    结果_index.append(索引)
    结果=[x[a]表示结果中的索引]
    
    以下是其工作原理:

    • 在循环中,我们存储的是索引,而不是数字本身
    • 对于每个索引,我们检查两个条件:其中有一个数字大于或等于阈值我们以前从未见过该索引
    • 如果条件满足,我们保存的是索引,而不是数字
    • 重复,直到我们有3个索引
    • 通过直接从这些索引中获取数字来构建新列表

    您随机检查任何大于阈值的值,并且您需要打印3个大于阈值的数字,这是您的问题吗?您写了“至少3次”,但您是随机选择的,因此您想在大于阈值的3个数字之后停止吗?请重复并从中选择。您必须诚实地尝试解决方案,然后询问有关实现的具体问题。“帮我写这个程序”与堆栈溢出无关。我将指出一个直接的设计差异:您将主循环设计为执行16次。在功能需求中,您在哪里看到16这个值?我看到的唯一一个基于迭代的限制是,您需要3个满足阈值的实例。您的主循环逻辑需要修复。@LevM。是的,我想在遇到3次后停止。如果这是一个真正的问题,请使用上面@alani的解决方案。我假设这是某种硬件问题,他们希望看到在满足某个条件时,可以跳出for循环。