0

我想我的问题不在于方法,而在于切片列表(例如列表 [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 只是没有按应有的方式工作,但我对编程非常陌生,所以我不确定我是否遗漏了什么。

感谢您提供的任何帮助。

4

4 回答 4

2

当你这样做时guess = random.choice(possibilities),你会从列表中获取一个值,但是当你这样做时你将它用作索引possibilities = possibilities[:(guess-1)]:在循环几次后,您的列表中的值超出了索引范围:

[80, 81, 82, 83, 84, 85, 86, 87]

当你从这里选择一个值(比如 85),然后 do possibilities = possibilities[85:],你会得到一个空列表。

你需要坚持索引。

于 2012-06-30T02:14:41.353 回答
1

您将这些值possibilities与它们的索引混淆了。mylist[:i]表示“mylist 中直到第 i 个元素的所有值”,而不是“直到具有值 i 的元素”。

最初,混淆索引和值不会导致问题,因为您的列表值(几乎,因为您跳过 0)等于它们的索引。但是当您开始切割列表的各个部分时,您会遇到列表比其中的某些值短的情况。例如,当 80 以下的所有内容都已被删除并且您猜测为 90 时,possibilities[90:]尝试从长度为 20 的列表中访问第 90 个元素。当然,这是行不通的。

试试这个:

i = possibilities.index(guess)    
possibilities = possibilities[:(i-1)]
于 2012-06-30T02:17:24.883 回答
0

切片由索引而不是元素的值定义。如果您有一个列表切片x[a:b],它给出了一个列表,其中a第 th 项后跟第a+1th 项,直到但不包括第bth 项。如果b小于或等于a结果将为空。如果b大于或等于列表中的项目数,a则将包含 th 之后的每个项目。如果省略第一个数字,则假定为 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为猜测加一,如果答案小于猜测,则设置hi为猜测减一。

于 2012-06-30T02:25:14.613 回答
0

When "5" is selected, this code will remove from the fifth position onwards. 您的数组只有四个元素,所以这意味着所有元素。

于 2012-06-30T02:14:55.633 回答