列出python中的切片错误

时间:2012-06-30 02:09:12

标签: python python-2.7

我想我的问题不是方法,而是切片列表(例如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就像它应该按照预期的方式工作,但我对编程非常新,所以我不确定我是否遗漏了一些东西。

感谢您提供的任何帮助。

4 个答案:

答案 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):]

编写猜测数字类型程序的更好方法是仅使用两个变量hilo来分别跟踪答案可能的最大和最小数字是。如果答案大于猜测,则将lo设置为猜测加1,如果答案小于猜测集hi则猜测减去1。