Ich schreibe ein Python-Skript, das es menschlichen und Computerspielern ermöglichen soll, Tic Tac Toe zu spielen. Um das Board darzustellen, verwende ich ein 3x3 Numpy-Array mit 1
und 0
für die Marken der Spieler (statt "X" und "O"). Ich habe die folgende Funktion geschrieben, um den Sieger zu ermitteln:Wie man eine Funktion zur Bestimmung des Gewinners von Tic-Tac-Toe prägnanter macht
import numpy as np
class Board():
def __init__(self, grid = np.ones((3,3))*np.nan):
self.grid = grid
def winner(self):
rows = [self.grid[i,:] for i in range(3)]
cols = [self.grid[:,j] for j in range(3)]
diag = [np.array([self.grid[i,i] for i in range(3)])]
cross_diag = [np.array([self.grid[2-i,i] for i in range(3)])]
lanes = np.concatenate((rows, cols, diag, cross_diag))
if any([np.array_equal(lane, np.ones(3)) for lane in lanes]):
return 1
elif any([np.array_equal(lane, np.zeros(3)) for lane in lanes]):
return 0
So zum Beispiel, wenn ich
board = Board()
board.grid = np.diag(np.ones(3))
print board.winner()
ausführen ich das Ergebnis 1
. Was mich etwas stört ist die Wiederholung der any
Aussagen. Ich würde denken, dass es eine prägnantere, trockenere Art geben würde, dies zu kodieren. (Ich dachte an einen Schalter/Fall wie in MATLAB, aber das gibt es in Python nicht). Irgendwelche Vorschläge?
Es ist _much_ effizienter, einen Generator ausdruck als ein Listenverständnis zu füttern. "beliebige" Kurzschlüsse, d. h., es stoppt die Auswertung weiterer Elemente, sobald es ein True-Element erhält. Aber wenn Sie eine Liste comp übergeben, muss die gesamte Liste erstellt werden, bevor "any" mit der Arbeit beginnen kann. Wenn Sie dagegen ein gen exp wie 'any (np.array_equal (lane, np.ones (3)) für lane in lanes) übergeben, erzeugt das gen exp nicht die späteren Elemente. Ähnliche Bemerkungen gelten für "alle". –