【问题标题】:checking if a random value exists from previous loop检查前一个循环中是否存在随机值
【发布时间】:2017-02-19 12:51:09
【问题描述】:

我正在尝试为每个循环生成一个随机值并将其保存到变量minimum,同时检查该数字是否已经在之前的循环之一中生成。

listQ 基本上包含从文件中随机选择的 6 行。这些行是从1max_line 之间选择的(基本上比max_line 值少6 步)。所以重要的是我必须生成一个乘以 6 的数字。

for x in range(0, 10):
    minimum = random.randrange(0, max_line,6)
    maximum = minimum+6
    listQ = listQ[minimum:maximum]

这里有点卡住了。可能是一个列表?

【问题讨论】:

  • 当然,附加到列表并使用number in list 进行检查是可能的。不过,对于大量数据,set() 会更好。当然,这个辅助数据结构是在循环之外定义的!
  • 你的逻辑错了。假设 maximum = minimum + 6 是没有意义的,因为 randrange 可以返回 0 作为最小值,因此最大值最多只有 6。
  • 0 和 6 没有错,因为 0 是列表中的第一个值。

标签: python loops random


【解决方案1】:

保留所有先前值的列表并检查每个后续迭代。

# sets have faster "val in set?" checks than lists
# do this once, somewhere in your program
previous_vals = set()

# other stuff here, including main program loop
for x in range(0, 10):
    # find a unique, new random number while 
    # limiting number of tries to prevent infinite looping
    number_of_tries = 0
    MAX_TRIES = 10
    generating_random = true
    while generating_random:    
        minimum = random.randrange(0, max_line,6)
        if minimum not in previous_vals:
            previous_vals.add(minimum)
            generating_random = false
        number_of_tries += 1
        if number_of_tries == MAX_TRIES:
            raise RunTimeError("Maximum number of random tries reached!")

    maximum = minimum+6
    listQ = listQ[minimum:maximum]

如果你想修改你的例子,请注意there are other functions for set than add

我还添加了最大尝试次数,以防止您的代码陷入无限循环,因为我对您的输入数据一无所知,也不知道陷入这种情况的可能性。

【讨论】:

  • 谢谢,这真的很有帮助!
  • 顺便说一句,是否可以构造这个文件只打开一次? with open 是否有可能 ----- if reply[0] == 'm': with open('questions.txt') as f: max_line = len(f.readlines()) with open('questions.txt') as f: allQ = [line.strip() for line in f]
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多