【问题标题】:How to combine on if statment if int number equal to element in the list of int?如果 int 数等于 int 列表中的元素,如何结合 if 语句?
【发布时间】:2020-08-13 03:33:37
【问题描述】:

假设我想随机数,但该数字不能是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

【问题讨论】:

  • 改用random.sample,比如random.sample(range(size), n)
  • 不要将递归用于此类目的。只需构造一个while 循环。
  • @FranciscoCouzo 是的,但我们不知道listofnumbers 是否会自动填充新的随机数。
  • 不错!但是我怎样才能避免从 0 到大小的generet 编号,除了编号 i 吗?例如:i = 2 random.sample(range(0, 6), 3)
  • random.sample(list(range(0, 3)) + list(range(4, size+1)))

标签: python random


【解决方案1】:

您可以检查它是否在您的列表中使用

if randlink in listofnumbers:

【讨论】:

    【解决方案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 之间的明确关联。您暗示这是在您不想实例化的大范围内进行采样而不进行替换的某种尝试。函数random.sample 正是为此目的而创建的。如果传入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 几乎相同,但要慢得多。唯一的区别是异常类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2022-08-19
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2013-02-20
      相关资源
      最近更新 更多