#python #pandas #numpy #pycharm #chess
#python #pandas #numpy #pycharm #шахматы
Вопрос:
у меня есть 2D-список, и я пытаюсь обновить значение ячейки, в то время как мне нужно уменьшить значения других ячеек, которые я не увеличиваю.
у меня есть 2D-список под названием
PAWN = [
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]
]
И в моем коде я обновляю все квадраты, которые включают ход пешки, например, g3, h4, матрица будет обновляться следующим образом, добавляя 0,1 для хода, и это работает довольно хорошо.
PAWN = [
A B C D E F G H
8 [0, 0, 0, 0, 0, 0, 0, 0],
7 [0, 0, 0, 0, 0, 0, 0, 0],
6 [0, 0, 0, 0, 0, 0, 0, 0],
5 [0, 0, 0, 0, 0, 0, 0, 0],
4 [0, 0, 0, 0, 0, 0, 0, 0.1],
3 [0, 0, 0, 0, 0, 0, 0.1, 0],
2 [0, 0, 0, 0, 0, 0, 0, 0],
1 [0, 0, 0, 0, 0, 0, 0, 0]
]
Вот фрагмент моего кода:
white_moves = ['g3', 'h4']
for moves in white_moves:
delta = 0.1
if len(moves) == 2: # for example g3
y = moves[0] #y = g
x = int(moves[1]) #x = 3
coordinate = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h'}
c = coordinate.values()
for key, value in coordinate.items():
if y == value:
indice_colonna = key
for letter in c:
if letter == y: # if value in dictionary is equal to my y
file = open('../data/tables/pedone.csv', 'r') #reading from csv file
reader = csv.reader(file)
PAWN = list(reader)
file.close()
new_pawn = PAWN
new_pawn[8-x][indice_colonna] = round(float(PAWN[8-x][indice_colonna]) delta, 1) #here im incrementing the value of square [g][3]
new_pawn = open("../data/tables/pedone.csv", 'w', newline='') #updating that file
writer = csv.writer(new_pawn)
writer.writerows(PAWN)
new_pawn.close()
break
Как я могу уменьшить все остальные квадраты? из строки 0 в 8 и столбца 0 в 8, но избегая уменьшения также квадрата g3? у меня возникли проблемы с разделением этих двух операций
вот что я пробовал:
rows = 8
columns = 8
for i in range(rows):
for j in range(columns):
pedone[i][j] = -0.1
pedone[8-x][indice_colonna] = 2*0.1 #trying to add 2x the value
но не работает, какие-либо предложения?
Ответ №1:
В вашем цикле, пытающемся добавить значение в 2 раза, вы перезаписываете всю матрицу каждый раз, когда выполняете итерацию, и устанавливаете только одно значение.2. Вам нужно будет разделить их, а затем применить операцию. Кроме того, если бы вы увеличивали значение, оно увеличивалось бы каждый раз, когда вы проходите через цикл.
Это потребует от вас считывания CSV-файла в матрицу в начале и записи его в конце, а не повторной записи в него, если только вы не хотите вычитать значение при каждом возможном перемещении, а не только один раз.
rows = 8
columns = 8
# read CSV into pedone
for i in range(rows):
for j in range(columns):
pedone[i][j] -= 0.1
# and then enter your loop:
for moves in white_moves
...
pedone[8-x][indice_colonna] = 2 * 0.1
# write pedone back to CSV
Комментарии:
1. к сожалению, у меня будет огромная база данных ходов, поэтому я думаю, что нехорошо обновлять 2 * дельта выбранного хода, мне нужно что-то, что делает и то, и другое…
Ответ №2:
Проблема здесь в том, что вы оба удаляете -0.1
из каждой ячейки (что нормально) и на каждой итерации добавляете 2*0.1
в целевую ячейку. Однако вы хотите добавить 2*0.1
только один раз!
Попробуй это:
rows = 8
columns = 8
pedone[8-x][indice_colonna] = 2*0.1 #trying to add 2x the value ONE TIME ONLY
for i in range(rows):
for j in range(columns):
pedone[i][j] = -0.1
Комментарии:
1. спасибо, теперь это имеет смысл, но все же это не лучшее решение, есть способ сообщить python: «обновите эту строку / col /, уменьшив все остальные?»
2. что-то вроде «удалить из строк и столбцов, строка = 3 и столбцы = g», но для всех возможных перемещений в white_moves
3. Хорошо, там тоже была опечатка. Вы написали
= 2*0.1
, что означает «присвоить 0.2» вместо= 2*0.1
того, что означает обновить значение. Попробуйте сейчас.