如何在if station if int number等于int列表中的元素时组合?

2024-10-01 15:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想要随机数,但该数不能是i,也不能是列表中已经存在的数。如何对照if语句中的列表进行检查

我想我已经接近答案了:

if randlink == i or (randlink == x for x in listofnumbers):
    return randNumber(i, listofnumbers)

此函数返回以前未出现的数字,代码如下:

def randNumber(i, listofnumbers):
    from random import randrange
    randlink = randrange(0, size)
    if randlink == i or [randlink == x for x in listofnumbers]:
        return randNumber(i, listofnumbers)
    return randlink

Tags: or函数答案代码in列表forreturn
2条回答

您要查找的运算符是in

if randlink == i or randlink in listofnumbers:
    ...

在这种情况下,递归是个坏主意,因为您的代码可能会搜索很长时间。改为使用循环:

randlink = randrange(0, size)
while randlink == i or randlink in listofnumbers:
    randlink = randrange(0, size)
return randlink

不要使用列表,因为它具有线性查找。改为使用集合:

s = set(listofnumbers)

在函数外部执行此操作一次。查找的界面相同:

while randlink == i or randlink in s:

最后,拒绝采样通常不是最优的。更好的方法是找出如何将采样映射到所需的范围

在代码中,没有显示ilistofnumberssize之间的显式关联。您暗示这是一种在不希望实例化的大范围内进行无替换采样的尝试。函数^{}就是为了这个目的而创建的。如果将range(size)作为序列传递,则无论size有多大,都只需要分配实际拾取的样本

假设您想要生成n个样本,i是您想要避免的随机数。random.sample的约定是任何子集都具有相同的一致性,因此您可以执行以下操作:

numbers = set(random.sample(range(size), n + 1))
try:
    numbers.remove(i)
except KeyError:
    numbers.pop()

如果您确实想保留random.sample返回的原始顺序,您可以再做一些工作:

numbers = random.sample(range(size), n + 1)
try:
    numbers.remove(i)
except ValueError:
    numbers.pop()

在本例中list接口几乎与set相同,但速度要慢得多。唯一的区别是异常类型

您可以使用

if randlink in listofnumbers:

相关问题 更多 >

    热门问题