Python: TypeError: объект 'str' не поддерживает назначение элемента

97
8

У меня есть эта проблема при создании простой игры с линкором. Вот мой код:

board = []
row = ['O'] * 5 #<<<<determine the board size here
joined_O = ' '.join(row)

for i in range(5): #<<<<determine the board size here
board.append(joined_O)
print(joined_O)

from random import randint #<<<< this code is to determine where the ship is. It is placed randomly.
ship_row = randint(1,len(board))
ship_col = randint(1,len(board))

print(ship_row,', ',ship_col,'\n')

print('Shoot missile to the ship')
missile_row = int(input('row : '))
missile_col = int(input('column: '))

#I really don't know where you're supposed to put the int() thingy so i put it everywhere
if int(missile_row) == int(ship_row) and int(missile_col) == int(ship_col):
print("Congratulation! You've hit the ship.")
break
elif int(missile_row) >= len(board) or int(missile_col) >= len(board):
print('Sorry! Area is out of range.')
break
else:
print('Missile missed the target')
board[int(missile_row)][int(missile_col)] = 'X'
print(board)

Я попытался переназначить "О, где ракета попала с" Х ", но потом она говорит

TypeError: объект 'str' не поддерживает назначение элемента.

спросил(а) 2016-06-24T17:18:00+03:00 4 года, 3 месяца назад
1
Решение
69

for i in range(5): #<<<<determine the board size here
board.append(joined_O)

Мне это не подходит. Вам следует добавлять списки на board, а не строки. Я предполагаю, что у вас раньше было что-то вроде:

for i in range(5):
board.append(row)

Это, по крайней мере, правильный тип. Но тогда у вас будут странные ошибки, когда вместо X вы увидите пять Xes, когда вы пропустите корабль. Это связано с тем, что каждая строка является одной и той же строкой; внесение изменений в один делает изменения для всех из них. Вы можете избежать этого, сделав копию строки каждый раз, используя трюк.

for i in range(5): #<<<<determine the board size here
board.append(row[:])

Теперь ваш Xes должен правильно назначить. Но print(board) в вашем блоке else будет немного уродливой. Вы можете легко отформатировать его без скобок и кавычек, используя пару быстрых соединений:

else:
print('Missile missed the target')
board[int(missile_row)][int(missile_col)] = 'X'
print("\n".join(" ".join(row) for row in board))

Теперь у вас есть неплохой результат.

Shoot missile to the ship
row : 1
column: 1
Missile missed the target
O O O O O
O X O O O
O O O O O
O O O O O
O O O O O

ответил(а) 2016-06-24T17:25:00+03:00 4 года, 3 месяца назад
57

Смотреть на:

board = []
row = ['O'] * 5 #<<<<determine the board size here
joined_O = ' '.join(row)
    доска - это список. строка - это список. join_O - это строка, сформированная путем объединения элементов строки.

А ТАКЖЕ:

for i in range(5):  #<<<<determine the board size here
board.append(joined_O)
print(joined_O)

доска теперь представляет список строк

Так

board[int(missile_row)][int(missile_col)] = 'X'

не является допустимой командой, потому что она пытается изменить строку в списке плат вместо элемента в 2D-списке. В Python строки неизменяемы, поэтому вы не можете изменить их символы на месте.

Короче говоря, плата не является 2D-списком в вашем коде, а списком строк.

ответил(а) 2016-06-24T17:24:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема