Python:生成不在列表中的随机整数

时间:2018-01-15 16:19:44

标签: python random

我是Python的新手(一般编码)。 我正在尝试创建一个创建列表副本的函数,其中包含字符串" rand"的任何实例。替换为随机整数。 该函数将被调用多次,每次都有一个新的input_list。这些新项目应附加到现有输出列表中。我们可以假设没有重复的整数,但是" rand"字符串可能会出现很多次。 这是我目前的代码。它非常接近我想要的,除了当随机数已经在列表中时,它只是移动到下一个项目而不是尝试创建一个新的随机数。 任何人都可以帮我解决这个问题吗? 提前谢谢。

import random
input_list = [1, 3, "rand", 2]
def number_adder(input_list):
  output_list = []

  for item in my_list:
    if item == "rand":
      new_variable = int(random.randint(0, 4))
      if new_variable in output_list:
        continue
    else:
      new_variable = item

  output_list.append(new_variable)
return output_list

3 个答案:

答案 0 :(得分:2)

import random

input_list = [1, 3, "rand", 2]
output_list = []

options = set(range(5))
for item in input_list:
  if item == "rand":
    new_variable = random.choice(list(options))
  else:
    new_variable = item
  output_list.append(new_variable)
  options -= set([ new_variable ])

你可以这样做。但这意味着,如果找不到随机数,那么这将是一个例外。

这将保留set个剩余选项,只要将新值添加到输出列表,该选项就会减少。每当需要随机数时,它将使用choiceset中获取随机元素。这样,您不必使用循环来重复调用随机函数,直到找到有效的随机数。

一个循环看起来似乎可行,直到你得到更大的数字,所以你必须重试很多,直到你找到一个有效的随机数(例如99990元素列表中的randint(0, 100000))。这会不必要地降低代码速度。

实际上,我使用生成器对代码进行了一些改写:

def fill_randoms(list_with_randoms, options):
  for item in list_with_randoms:
    value = random.choice(list(options)) if item == 'rand' else item
    yield value
    options -= set([ value ])

我称之为:

list(fill_randoms([1, 3, "rand", 2], set(range(5))))

但如果您不熟悉生成器,请坚持使用其他代码。

答案 1 :(得分:1)

当数字在输出列表中时循环:

if item == "rand": 
    new_variable = int(random.randint(0, 4))
    while new_variable in output_list:
        new_variable = int(random.randint(0, 4))

答案 2 :(得分:1)

我修复了评论中指出的错误。 以下是满足您要求的两个功能:

Route::get('profile', function () {
    // Only authenticated users may enter...
})->middleware('auth');