python的随机位置_在python中随机查找列表中可用位置的有效算法

None

from random import random

def randint(max_val):

return int(random() * max_val)

def assign(values, target):

output = []

mapping = dict()

mmax = 0

size = len(target)

for val in values:

idx = randint(size)

while target[idx] != None:

if idx in mapping:

idx = mapping.pop(idx)

mmax = max(mapping or [0])

break

min_size = max(idx, mmax)

try:

size -= target[size-1:min_size:-1].index(None)

except:

size = min_size + 1

if target[size-1] == None:

size -= 1

mapping[idx] = size

if idx > mmax:

mmax = idx

elif size-1 in mapping:

size -= 1

mapping[idx] = mapping.pop(size)

mmax = max(mapping or [0])

idx = randint(size)

target[idx] = val

output.append(idx)

return output

请注意,这将修改传递给它的目标列表。如果您不想修改它,您实际上有两个选项:实现一些额外的逻辑来检查“空闲”地址是否已经被使用,或者复制整个列表(在这种情况下,反转它并修补索引,以便

.index()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值