繁体   English   中英

列出python中的切片错误

[英]List slicing errors in python

我想我的问题不仅仅在于方法,而在于切片列表(例如list [2:5])。 在实际运行代码时,它并没有在正确的位置剪切列表。 该程序试图猜测用户给它的数字。 它是使用random模块执行此操作的,我知道这可能不是最好的方法,但是我正在尝试。

编码:

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只是没有按预期的方式工作,但是我对编程非常陌生,所以我不确定是否丢失了某些东西。

感谢您提供的任何帮助。

当您确实guess = random.choice(possibilities) ,您将从列表中获取一个值,但是当您执行以下操作时,您将其用作索引: possibilities = possibilities[:(guess-1)] 循环几次后,您的列表中的值超出了索引范围:

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

当您从此处选择一个值时(例如85),然后执行possibilities = possibilities[85:] ,您将返回一个空列表。

您需要坚持索引。

possibilities将值与它们的索引混淆。 mylist[:i]意思是“ mylist中直到ith元素的所有值”,而不是“直到具有i的元素的所有值”。

最初,混淆索引和值不会造成问题,因为列表值(几乎是因为您跳过了0)等于它们的索引。 但是,当您开始删除列表的一部分时,会遇到列表短于列表中某些值的情况。 例如,当所有低于80的东西都被删除并且您猜到90时, possibilities[90:]尝试从长度为20的列表开始访问第90个元素。当然,这是行不通的。

尝试以下方法:

i = possibilities.index(guess)    
possibilities = possibilities[:(i-1)]

当选择“ 5”时,此代码将从第五个位置开始删除。 您的数组只有四个元素,因此意味着所有元素。

切片由索引而不是元素的值定义。 如果列表的切片x[a:b]给出了一个列表,其中aa个项目,然后是第a+1个项目,但不包括第b个项目。 如果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):]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM