Создайте и инициализируйте сетку 5x5 для линкоров

Итак, я только что завершил раздел проблемы Морского боя CodeAcademy и отправил правильный ответ, но не могу понять, почему он правильный.

Идея состоит в том, чтобы построить сетку 5x5 в виде доски, заполненной буквами «О». Правильный код, который я использовал, был:

board = []
board_size=5

for i in range(board_size):

    board.append(["O"] *5)

Однако я смущен тем, почему это не создало 25 "O" в одной строке, поскольку я никогда не указывал, чтобы итерировать в отдельную строку. Я старался

for i in range(board_size):

    board[i].append(["O"] *5)

но это дало мне ошибку: IndexError: list index out of range. Может ли кто-нибудь объяснить, почему первое верно, а не второе?


person KRS-fun    schedule 29.01.2014    source источник


Ответы (7)


["O"]*5

Это создает список размером 5, заполненный "O": ["O", "O", "O", "O", "O"]

board.append(["O"] *5)

Это добавляет (добавляет в конец списка) приведенный выше список к board[]. Выполнение этого 5 раз в цикле создает список, заполненный 5 из вышеуказанных списков.

[["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"],
["O", "O", "O", "O", "O"]]

Ваш код не сработал, потому что списки не инициализируются размером в питоне, он просто запускается как пустой контейнер []. Чтобы заставить вас работать, вы могли бы сделать:

board = [[],[],[],[],[]]

и в вашем цикле:

board[i] = ["O"]*5
person turbo    schedule 29.01.2014

Списки Python начинаются пустыми:

board = [] # empty list

В отличие от некоторых языков программирования, вы не указываете и не инициализируете границы массива, поэтому, если вы попытаетесь получить доступ по индексу:

board[0]

вы получите IndexError; индекса 0 еще нет.

В первой версии при каждом проходе по циклу for вы append (добавляете в конец списка) новый список, содержащий пять "O". Если вы хотите, чтобы список board содержал 25 "O", вместо этого вы должны использовать extend:

for i in range(board_size):
    board.extend(["O"] *5)
person jonrsharpe    schedule 29.01.2014

Код должен выглядеть так. board = [] for i in range(0, 5): board.append(["O"]*5) print(board)

person SanchelliosProg    schedule 14.05.2015

Я думаю, проблема проста: когда вы запускаете свой код, ваш массив пуст!

Вы могли бы оформить

board = [[], [], [], [], []]

чтобы инициализировать его как вложенный массив из пяти мест.

Вы также можете использовать dict для имитации неопределенно вложенного массива:

board=defaultdict(lambda:defaultdict(lambda:[]))
person Vincenzo Maggio    schedule 29.01.2014

board = []
board_size=5

for i in range(board_size):

    board.append(["O"] *5)

В этом коде board начинается как пустой список. ["O"] * 5 создаст список, равный ["O", "O", "O", "O", "O"]. Затем он будет добавлен в список board. В этом примере это произойдет 5 раз, начиная с board_size == 5.

for i in range(board_size):

    board[i].append(["O"] *5)

Это не сработало бы, если бы элемент с индексом i не был списком, поскольку append() является методом класса list. Если вы хотите вставить что-то в i, вы должны использовать метод списка insert()

person kylieCatt    schedule 29.01.2014

Это связано с тем, что каждый раз, когда вы запускаете board.append(["O"] *5), вы создаете новый список (из-за квадратных скобок, используемых внутри оператора добавления).

Если бы вы использовали board.append("O" *5) вместо этого, вы получили бы один список с пятью элементами, например:

['ООООО', 'ООООО', 'ООООО', 'ООООО', 'ООООО']

*5 умножает строку. если вы просто запустите интерактивную подсказку 'O' * 5, вы получите:

'ООООО'

Однако, если вы запустите ['O'] * 5, он умножит текст в списке, и вы получите список из пяти элементов.

['O', 'O', 'O', 'O', 'O']

Вы добавили пять списков, в каждом из которых по 5 элементов.

person ChrisProsser    schedule 29.01.2014

Первый шаг в codeacademy

board = []
for i in range(5):
    board.append(["O"]*5)

print board

Второй шаг в codeacademy

board = []

def print_board(board):
    for x in range(5):
        board= (["O"] * 5)
        print board
    return board

print_board(board)

третий шаг в codeacademy

board = []

def print_board(board):
    for x in range(5):
        board= (["O"] * 5)
        print " ".join(board)
    return board

print_board(board)

4-й шаг

from random import randint 

board = []

for x in range(0, 5):
    board.append(["O"] * 5)

def print_board(board):
    for row in board:
        board = " ".join(row)
        return  board

def random_row(board):
    return randint(0, len(board) - 1)

def random_col(board):
    return randint(0, len(board) - 1)

print print_board(board)
print random_row(board)
print random_col(board)

5-й шаг батлшипа в codeacademy

from random import randint

board = []

for x in range(0,5):
    board.append(["O"] * 5)

def print_board(board):
    for row in board:
        print " ".join(row)

def random_row(board):
    return randint(0, len(board) - 1)

def random_col(board):
    return randint(0, len(board[0]) - 1)

ship_row = random_row(board)
ship_col = random_col(board)


guess_row = int(raw_input("Guess Row: "))
guess_col = int(raw_input("Guess Col: "))

Последний шаг. Давайте .. Сыграем в игру BettleShip CodeAcademy

from random import randint

board = [] для x в диапазоне (5): board.append(["O"] * 5)

def print_board(board): для строки на доске: print " ".join(row)

print "Давай поиграем в Морской бой!" print_board (доска)

def random_row(board): вернуть randint(0, len(board) - 1)

def random_col(board): вернуть randint(0, len(board[0]) - 1)

ship_row = random_row(board) ship_col = random_col(board) print ship_row print ship_col

повороты = 0 выигрыш = 0 для поворота в диапазоне (4): если ход ‹ = 5: угадай_строка = int (raw_input («Угадай строку:»)) Guess_col = int (raw_input («Угадай столбец:»))

    if guess_row == ship_row and guess_col == ship_col:
        print "Congratulations! You sunk my battleship!"
        win +=1
        if win == 2:
            break
    else:
        turns +=1
        if (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4):
            print "Oops, that's not even in the ocean."
        elif(board[guess_row][guess_col] == "X"):
            print "You guessed that one already."
        else:
            print "You missed my battleship!"
            board[guess_row][guess_col] = "X"
            print (turn + 1)
        print_board(board)
elif turns == 3:
    print "Game Over"
else:
    print "Max Turn try is over Try Again"
person Engr Nayab Bukhari Syed    schedule 22.07.2014