2

我在尝试获取 while 循环来验证用户输入,然后确保用户不重复值时遇到问题。下面显示的是我尝试过的两种方法,但我不知道如何让它们工作。

方法一

def test():
my_list = ["", "", ""]
for i in range(3):
    while (my_list[i] != "one") and \
          (my_list[i] != "two") and \
          (my_list[i] != "three"):

        while (my_list[i] == my_list[0]) and \
              (my_list[i] == my_list[1]) and \
              (my_list[i] == my_list[2]):

            text = "Enter, one, two or three", i + 1, ":"
            try:
                my_list[i] = input(text)
            except KeyboardInterrupt:
                sys.exit()

print(my_list)

方法二

def test2():

my_list= ["", "", ""]
while len(my_list)!=len(set(my_list)) == True:
    for c in range(4):
        while (my_list[i] != "one") and \
              (my_list[i] != "two") and \
              (my_list[i] != "three"):
            text = "Enter, one, two or three", c + 1, ":"
            try:
                my_list[c] = input(text)
            except KeyboardInterrupt:
                sys.exit()


print(my_list)
4

1 回答 1

3

为什么不简化一下:

my_list = []
while len(data) < 3:
    data = input(text) # Valid for Python 3, use raw_input(text) in Python 2
    if data in ("one", "two", "three") and data not in my_list:
        my_list.append(data)

这是您要求的或多或少的直接翻译:

  1. 我有一个清单
  2. 虽然列表太小
    1. 获取一些数据
    2. 如果数据是有效值之一,并且不在列表中
      1. 将其添加到列表中

在这种情况下使用for x in range(y)只会增加复杂性,因为您实际上并不知道希望循环运行多少次。

没有理由用无效值 ( my_list = ["", "", ""]) 预先填充列表,因为可以使用 来调整列表的大小append

此外,您的sys.exit代码是不必要的并且可能有害。只要让异常传播,它就会使程序本身崩溃(除非你抓住它,你几乎不应该为KeyboardInterrupt异常做这件事)。

注意:如果您将两个 while 循环组合成一个,您的第一个版本就可以工作,这只是不必要的复杂。

于 2012-12-07T17:24:56.317 回答