Проверьте мой кортеж кортежей и измените заданное значение

#python #list #indexing #tuples

#python #Список #индексирование #Кортежи

Вопрос:

Итак, я играю в крестики-нолики с кортежем из 3 кортежей. (матрица 3×3)

моя функция: определить do_position(доска, игрок, позиция): Я хочу вернуть свою новую плату с новым значением, например:

доска = ((1,-1,0),(1,0,-1),(1,-1,0))

do_position(доска, -1, 5)

((1, -1, 0), (1, -1, -1), (1, -1, 0))

доска — это мой кортеж, игроком будет значение (-1 (для 0 игроков) или 1 (для X игроков)), а позиция — это позиция моего кортежа, где я хочу поместить свой int (-1 или 1).

Я знаю, что мне нужно превратить свой кортеж в списки, чтобы я мог достичь нужной позиции, но я перепробовал много способов, и мой вывод по-прежнему возвращает мою исходную плату без каких-либо изменений. Вот одна из моих попыток:

 def do_position(board,player, position):

   newboard = ()

   position=[1,2,3,4,5,6,7,8,9]

   player = (-1,1)
    
    for p in position:
        board[position[p]-1] = player[p]
    
    for position,player in enumerate(board):
        if player == 1:
           board[position] = 1
        elif player == -1:
             board[position] = -1
return newboard
 

Кто-нибудь может помочь?

Комментарии:

1. Можете ли вы дать def do_position(board, player, position): код функции??

2. вы возвращаете newboard . когда вы вносили изменения в newboard ??

3. @akash правильно! я этого не сделал! И мне нужно что-то, чтобы увидеть, равна ли моя позиция 0, чтобы я мог изменить эту позицию для игрока (-1 или 1)

4. проверьте ответ, если он соответствует вашим потребностям

Ответ №1:

кортеж неизменяем, что означает, что вы не можете изменить значение кортежа.

Итак, у вас пока есть 3 варианта —

  1. Восстановите плату с измененным значением.
  2. преобразуйте кортеж в список, внесите изменения и преобразуйте обратно в кортеж
  3. Используйте изменяемую коллекцию python, подобную списку board = [[1,-1,0],[1,0,-1],[1,-1,0]]

Альтернативный рабочий код:

 def do_position(board,player, position):
    position-=1
    row,col=position//3,position%3
    board[row][col]=player
    return board

board = [[1,-1,0],[1,0,-1],[1,-1,0]]
do_position(board, -1, 3)
 

Для доски кортежей :

 def tuple_to_list(board):
    return [list(x) for x in board]

def list_to_tuple(board):
    return tuple([tuple(x) for x in board])

def do_position(board,player, position):
    temp_board=tuple_to_list(board)
    position-=1
    row,col=position//3,position%3
    temp_board[row][col]=player
    return list_to_tuple(temp_board)

board = ((1,-1,0),(1,0,-1),(1,-1,0))
do_position(board, -1, 3)
 

Комментарии:

1. Спасибо @akash! только одна вещь, моя доска — это кортеж. Мне нужно поместить внутри функции это правильно? Я хочу, чтобы это произошло: > доска = ((1,-1,0),(1,0,-1),(1,-1,0)) > do_position(доска, -1, 5)

2. просто преобразуйте tuple --> list --> tuple

3. @CateC я обновил свой ответ. если все в порядке, проверьте как правильный ответ

4. Спасибо! вы мне очень помогли! Можете ли вы помочь мне с еще одним вопросом?