【问题标题】:How do I search a range for a single integer?如何在范围内搜索单个整数?
【发布时间】:2010-08-02 18:29:52
【问题描述】:

我的 Python 代码生成一个介于 0 到 35 之间的随机数,并将该数字存储为“随机”。我希望将“随机”与多个数字范围进行比较,以确定它属于三个组中的哪一个,并根据“随机”所在的组为“获胜”分配另一个值。这些组是:0-16、16- 34 和 34-36。 'winning' 总是返回 2。这是我迄今为止尝试过的。

import random #start python random number generator
random = random.randrange(36) #calls a random number between 0-35 and stores value
print random #test

for random in range(0, 16):
   winning = 0
for random in range(16, 34):
   winning = 1
for random in range(34, 36):
   winning = 45
print winning #test

提前感谢您提供的任何帮助!这是我第一次使用 Python 编程。

【问题讨论】:

  • 你说:“虽然'获胜'总是返回 2”。你一定是误会了。您发布的代码将始终打印45

标签: python random range


【解决方案1】:

首先,请不要将变量命名为random。它会隐藏 random 模块名称,因此您将无法在其余范围内使用 random 模块。

所以让我们将结果称为rnd


您应该使用if rnd in range(0, 16): ... 而不是for。语法

for a in list_:
  foo(a)

会一一提取list_中的每一个元素,每次都赋值给a,然后调用body。从the for it is a loop 可以看出。因此,您实际上设置了winning = 0 17 次等。

另一方面,语法

if b in list_:
  foo(b)

可以看作

if (b in list_):
  foo(b)

将检查b是否是list_的元素,如果条件为真则执行主体(the in is also an operator。)


您不应该使用in range(...) 来检查数字是否在数字范围内,因为在列表中搜索需要线性时间。 Pythonic 的方式是使用the a <= b < c notation:

if 0 <= rnd < 16:
  winning = 0

但实际上它可以更简单地写成(无论你使用哪种语言)

if rnd < 16:
  winning = 0
elif rnd < 34:
  winning = 1
else:
  winning = 45

【讨论】:

    【解决方案2】:

    您应该使用if 而不是forfor 是循环关键字。

    if random in range(0, 16):
        winning = 0
    

    实际上,range 的使用并不是很好,因为它会生成所有数字的完整列表,然后检查每个数字是否等于 random。做一些简单的比较会更有效率:

    if 0 <= random < 16:
        winning = 0
    
    # The above is a shorthand syntax for this:
    # if 0 <= random and random < 16
    

    【讨论】:

    • 是的!谢谢!效果非常好,并证实了我最初的猜测,如果它会起作用。
    • +0.1 用于回答 OPs 问题,+0.9 用于提供更 Pythonic(并且总体上更好)的解决方案
    • @Kevin:要确认这样的猜测,请尝试运行猜测的解决方案。
    【解决方案3】:

    我认为你想要的一个实现:

    def getWinning(number):
        ranges = {
            0: (0, 16),
            1: (16, 34),
            45: (34, 36)
        }
    
        for key in ranges :
            low, high = ranges[key]
            if low <= number < high:
                return key
    

    【讨论】:

      【解决方案4】:

      这是有点高级的代码结构,但实际上并没有那么复杂。

      from random import choice
      
      # Do list weighted by the winning chances
      winning=[0]*16+[1]*18+[45]*2
      
      for lottery in range(10):
          win =  choice(winning)
          print("Round %i:\t" % (lottery+1) +
                ("You won $%i" % win if win
                 else "No win this time")
                )
      

      【讨论】:

        【解决方案5】:

        使用bisect.bisect 是替换if 语句的好方法:

        import random 
        import bisect
        
        num = random.randrange(36) 
        print num 
        
        grid=(0,16,34,36)
        winning=bisect.bisect(grid,num)
        winning=45 if winning==2 else winning
        print(winning)
        

        PS。不要拨打您的随机号码random。这样做会破坏同名模块(例如,无法再次调用random.randrange)。这会导致潜在的难以发现的错误,因为异常 (AttributeError) 可能发生在远离错误真正原因的地方。

        【讨论】:

        • winning 应该是 45,而不是 2,当随机数≥34时。
        • 啊...这就是生成器给我带来问题的原因。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多