Мой вопрос связан с книгой Тони Гаддиса "Начинаем с 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): "))
Вы можете создать новый список и добавить каждый пользовательский ввод в этот список. Затем вы можете проверить, введен ли он уже во ввод. Пример:
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.")
Изменение: вы уже храните пользовательские входы в списке. Вы можете просто проверить, есть ли новый вход в вашем списке.
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
Вы можете проверить, есть ли число в квадрате, сравнив каждое значение в каждой строке с новым значением.
>>> 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
Я полагаю, вы бы просто проверили, находится ли он на площади.
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
Если это неэффективно, попробуйте иметь введенный список, и проверьте наличие там. Я оставлю это хардкорным парням, чтобы определить эффективность этого подхода