Как заставить пользователя вводить разные числа каждый раз в заданном диапазоне в Python?

1

Мой вопрос связан с книгой Тони Гаддиса "Начинаем с Python" (3-е издание). Это Глава 7. Вопрос 11. Позвольте мне взять вопрос для справки, а затем объяснить мой вопрос ниже.

Магический квадрат Ло Шу представляет собой сетку с 3 рядами и 3 столбцами. Магический квадрат Ло Шу обладает следующими свойствами: • Сетка содержит в точности числа от 1 до 9. • Сумма каждой строки, каждого столбца и каждой диагонали складывается в одно и то же число.

В программе вы можете моделировать магический квадрат, используя двумерный список. Напишите функцию, которая принимает двумерный список в качестве аргумента и определяет, является ли список магическим квадратом Ло Шу. Проверьте функцию в программе.

МОЙ ВОПРОС: В основном, я прошу пользователя заполнить эту сетку 3х3, используя цифры 1-9. Тем не менее, каждый номер должен отличаться друг от друга. Как я могу заставить пользователя каждый раз вводить другое число в заданном диапазоне (1-9)? Для этого есть специальная функция? После окончания главы "Списки" я не могу сделать это на Python.

Я также предоставляю свой код для этого вопроса, если он помогает. На данный момент пользователь может ввести любой номер, даже двузначный и т.д. Заранее спасибо.

# lo shu magic square

ROWS=3
COLS=3

def main():    
    # create the two dimensional list
    square = [[0, 0, 0],
              [0, 0, 0],
              [0, 0, 0]]

    for r in range(ROWS):
        for c in range(COLS):
            square[r][c]=int(input("Enter a number 1-9 (can't enter the same number again): "))
Теги:
list
multidimensional-array

4 ответа

2
Лучший ответ

Вы можете создать новый список и добавить каждый пользовательский ввод в этот список. Затем вы можете проверить, введен ли он уже во ввод. Пример:

inputs = []
while True:
 inp = input("Enter something: ")
 if inp in inputs:
  print("Please, enter something else! You already entered that!")
 else:
  print("Successfully entered!")
  inputs.append(inp)

Пример, который вы можете использовать в вашем случае:

numbers = []
while True:
 inp = int(input("Enter number from 1 to 9: "))
 if 1 <= inp <= 9 and inp not in numbers:
  print("Success!")
  numbers.append(inp)
 else:
  print("Your number is already entered or isn't in range 1-9. Please enter again.")

Изменение: вы уже храните пользовательские входы в списке. Вы можете просто проверить, есть ли новый вход в вашем списке.

  • 1
    Спасибо. Я буду работать над этим сейчас. Это действительно хорошая стратегия. Никогда не думал о сохранении входных данных в списке. Благодарю.
  • 1
    Я обновил ответ, теперь он ближе к вашему примеру.
2

Math - твой ответ другу:

print 1 <= x <= 9

Если я неправильно понял ваш вопрос, пожалуйста, дайте мне знать!


@edit: смотреть комментарии

square = [[0, 0, 0],
          [0, 0, 0],
          [0, 0, 0]]

entered = [];

for r in range(3):
    for c in range(3):
        v = int(input("Enter a number 1-9 (can't enter the same number again): "))
        if v > 9 or v < 1 or v in entered:
          print("bad number")
        entered.append(v)
        square[r][c]=v
  • 1
    Привет, я думаю, что ты сделал. Так что это двумерный список. Я прошу пользователя заполнить. Я думаю, это не функция печати, а функция ввода. Например, пользователь ввел 1 для квадрата [0] [0], но он / она должен ввести другое число для квадрата [0] [1] и т. Д., Пока все 9 элементов не будут заполнены.
  • 1
    Я полагаю, что понял эту часть. Я добавлю пример.
Показать ещё 6 комментариев
1

Вы можете проверить, есть ли число в квадрате, сравнив каждое значение в каждой строке с новым значением.

>>> square = [[0, 1, 9], [2, 5, 3], [6, 0, 4]]
>>> new_value = 7
>>> any(value == new_value for row in square for value in row)
False

Это использует встроенную функцию any.

Или вы можете проверить наличие содержимого in:

>>> 3 in [1, 2, 3]
True

Так:

>>> any(new_value in row for row in square)
False
  • 0
    Спасибо. Я проверяю все идеальные предложения здесь. Попробую твое дальше. Лучший.
1

Я полагаю, вы бы просто проверили, находится ли он на площади.

for r in range(ROWS):
    for c in range(COLS):
        entered = int(input("Enter a number 1-9 (can't enter the same number again): ")
        existing = True in [entered in row for row in square]
        if not existing:
            square[r][c]=entered

Если это неэффективно, попробуйте иметь введенный список, и проверьте наличие там. Я оставлю это хардкорным парням, чтобы определить эффективность этого подхода

Ещё вопросы

Сообщество Overcoder
Наверх
Меню