我想我的问题不是方法,而是切片列表(例如list [2:5])。当代码实际运行时,它不会在正确的位置切割列表。该程序试图猜测用户给出的数字。它是使用随机模块执行此操作,我知道这可能不是最好的方法,但我正在尝试。
守则:
import random
number = input('Pick a number from 1-100 for the computer to guess, \nand find out how many tries it takes the computer: ')
print number
possibilities = range(101)
del possibilities[0]
tries = 1
guess = random.choice(possibilities)
print "\n", guess
while guess != number:
if guess > number:
possibilities = possibilities[:(guess-1)]
else:
possibilities = possibilities[(guess-1):]
print possibilities
guess = random.choice(possibilities)
print guess
tries += 1
错误示例:
从上面的印刷声明中输出程序。我还想提一下,它并不总是出现故障,大约50-60%的时间它工作正常。此外,不仅仅是我输入的数字,例如,45可能正常工作,或者它可能会失败,因为它在下面,它似乎是一个非常随机的事件。
初始输入45:
45
30 [30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 ,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 ,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]
88 初始错误(该程序应该在88之后切断列表) [30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 ,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 ,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]
54 [30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 ,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 ,80,81,82] 40 致命错误(切断列表的位置,删除它“寻找”的数字) [69,70,71,72,73,74,75,76,77,78,79,80,81,82] 72 [69,70,71,72,73,74,75,76,77,78,79,80,81,82]
初始输入6:
6
48
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]
9
[1, 2, 3, 4, 5, 6, 7, 8]
5 **Initial Error** (the program should have eliminated 5 from the list below this line)
[5, 6, 7, 8]
5 **Fatal Error** (the program deleted the rest of the list)
[]
Traceback (most recent call last):
File "C:\Users\Joseph\Documents\Programming fun\computer guessing a number game.py", line 32, in <module>
guess = random.choice(possibilities)
File "C:\Python27\lib\random.py", line 274, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
IndexError: list index out of range
我想知道为什么Python会这样做,以及它是否可以避免。我认为我的代码没有问题,我认为Python就像它应该按照预期的方式工作,但我对编程非常新,所以我不确定我是否遗漏了一些东西。
感谢您提供的任何帮助。
答案 0 :(得分:2)
执行guess = random.choice(possibilities)
时,您将从列表中获取值,但在执行此操作时将其用作索引:possibilities = possibilities[:(guess-1)]
。循环几次之后,列表中的值超出索引范围:
[80, 81, 82, 83, 84, 85, 86, 87]
当您从此处选择一个值(如85),然后执行possibilities = possibilities[85:]
时,您将返回一个空列表。
你需要坚持索引。
答案 1 :(得分:1)
您将possibilities
中的值与其索引混淆。 mylist[:i]
表示“mylist中的所有值都是第i个元素”,而不是“直到具有值i的元素”。
最初,混淆索引和值不会导致问题,因为您的列表值(几乎,因为您跳过0)等于它们的索引。但是当你开始削减列表中的部分时,就会出现列表短于其中某些值的情况。例如,当80以下的所有内容都被移除并且您猜测为90时,possibilities[90:]
会尝试从长度为20的列表中访问第90个元素。当然,这不起作用。
请改为尝试:
i = possibilities.index(guess)
possibilities = possibilities[:(i-1)]
答案 2 :(得分:0)
选择“5”时,此代码将从第五个位置开始移除。你的数组只有四个元素,所以这意味着所有元素。
答案 3 :(得分:0)
切片由索引定义,而不是元素的值。如果您有一个列表x[a:b]
列表,其中的列表包含a
项,后跟a+1
项,但不包括b
项。如果b
小于或等于a
,则结果为空。如果b
大于或等于列表中的项目数,则会包含a
之后的每个项目。如果省略第一个数字,则假定为0,如果省略第二个数字,则假定列表中的项目数。这是一个不使用列表中的数字以避免混淆的示例:
x = ['a','b','c','d','e','f','g']
print x[3:] # prints ['d','e','f','g']
print x[:2] # prints ['a','b']
print x[1:4] # prints ['b','c','d']
如果在切片中使用负数,则列表的长度将添加到数字中以确定最终索引。
为了让你的代码正常工作并仍然使用切片来优化可能性列表,列表中有一个index
方法,它将给作为参数传递的项目的索引(当然)。因此,对于您的程序,您可以更改行以阅读
if guess > number:
possibilities = possibilities[:possibilities.index(guess)]
else:
possibilities = possibilities[possibilities.index(guess):]
编写猜测数字类型程序的更好方法是仅使用两个变量hi
和lo
来分别跟踪答案可能的最大和最小数字是。如果答案大于猜测,则将lo
设置为猜测加1,如果答案小于猜测集hi
则猜测减去1。