Python列表切片在我的猜测游戏中不起作用

问题描述 投票:2回答:2

我正在尝试创建一个游戏,用户想象一个1到20之间的数字,然后计算机尝试猜测它。以此目的:1.我创建了一个包含1到20的所有数字的列表。2.程序从列表中选择一个随机数,并询问虚数是否小于或大于该随机数。3.用户回答“ j”或“ n”4.每次猜测后,从冗余号码中切出列表5.最终,列表中应该只有一个数字,并且计算机应该得出正确的数字。代码:

import random
d = list(range(1,21))
tries = []
while True:
    if len(d) > 1:
        x = random.choice(d)
        tries.append(1)
        print(f"Is your number bigger than {x}?")
        answer = input()
        if answer == 'j':
            del d[:x]
            print(d)
        if answer == 'n':
            del d[x:]
            print(d)
        tries.append(1)
        x = random.choice(d)
        print(f"Is your number smaller than {x}?")
        answer = input()
        if answer == 'j':
            del d[x-1:]
            print(d)
        if answer == 'n':
            del d[:x-1]
            print(d)
    else:
        print(f"Your number is {d[0]}. You guessed with {len(tries)} attempts.")
        break

但是,奇怪的是切片无法正常工作,我多次遇到这样的结果:Output

您可以看到,在我确认我的电话号码小于9后,它不会从9-13删除电话号码

python slice
2个回答
2
投票

列表的索引随着列表的缩小而变化;您可以使用i = d.index(x)查找索引:

import random
d = list(range(1,21))
tries = []
while True:
    if len(d) > 1:
        x = random.choice(d)
        tries.append(1)
        print(f"Is your number bigger than {x}?")
        answer = input()
        i = d.index(x)
        if answer == 'j':
            del d[:i+1]
        if answer == 'n':
            del d[i+1:]
        print(d)
        tries.append(1)
        x = random.choice(d)
        print(f"Is your number smaller than {x}?")
        answer = input()
        i = d.index(x)
        if answer == 'j':
            del d[i:]
        if answer == 'n':
            del d[:i]
        print(d)
    else:
        print(f"Your number is {d[0]}. You guessed with {len(tries)} attempts.")
        break

2
投票

您不使用索引切片,而是使用列表内容。尝试此操作找到您的索引:

del[:d.index(x)]

而且,您也不需要一会儿,并且if语句也可以带一个中断。只是像这样使用。

while len(d) > 1:
    pass
    # some more code
else:
    print(f"Your number is {d[0]}. You guessed with {len(tries)} attempts.")

也不要使用列表并附加。 Eiter追加猜测的数字或仅使用增量计数器tries = 0/tries += 1

完整的代码可能如下所示。即使您只剩下选择,您的代码也需要始终两次尝试。比您应该限制现在可以提供价值答案的问题。x = random.choice(d[:-1])x = random.choice(d[1:])

import random

if __name__ == '__main__':
    d = list(range(1, 21))
    tries = 0
    while len(d) > 1:
        if random.choice([True, False]):
            x = random.choice(d[:-1])
            tries += 1
            print(f"Is your number bigger than {x}?")
            answer = input("Type: j/n\n")
            while answer != "j" and answer != "n":
                answer = input("Type: j/n\n")
            if answer == 'j':
                del d[:d.index(x) + 1]
                print(d)
            else:
                del d[d.index(x) + 1:]
                print(d)
        else:
            tries += 1
            x = random.choice(d[1:])
            print(f"Is your number smaller than {x}?")
            answer = input("Type: j/n\n")
            while answer != "j" and answer != "n":
                answer = input("Type: j/n\n")
            if answer == 'j':
                del d[d.index(x):]
                print(d)
            else:
                del d[:d.index(x)]
                print(d)
    else:
        print(f"Your number is {d[0]}. You guessed with {tries} attempts.")


© www.soinside.com 2019 - 2024. All rights reserved.