2

while ループを取得してユーザーの入力を検証しようとすると問題が発生し、ユーザーが値を繰り返さないようにします。以下に、私が試した2つの方法を示しますが、それらを機能させる方法がわかりません。

方法 1

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)

方法 2

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 つであり、まだリストにない場合
      1. リストに追加する

この場合に使用for x in range(y)すると、ループを実行する回数が実際にはわからないため、複雑さが増すだけです。

my_list = ["", "", ""]リストは でサイズ変更できるため、リストに無効な値 ( ) を事前に入力する必要はありませんappend

また、sys.exitコードは不要であり、おそらく有害です。例外を伝播させるだけで、プログラム自体がクラッシュします(キャッチしない限り、例外に対して行うべきではありませんKeyboardInterrupt)。

注: 最初のバージョンは、2 つの while ループを 1 つに結合した場合に機能しますが、不必要に複雑です。

于 2012-12-07T17:24:56.317 に答える