我是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
答案 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
个剩余选项,只要将新值添加到输出列表,该选项就会减少。每当需要随机数时,它将使用choice
从set
中获取随机元素。这样,您不必使用循环来重复调用随机函数,直到找到有效的随机数。
一个循环看起来似乎可行,直到你得到更大的数字,所以你必须重试很多,直到你找到一个有效的随机数(例如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');