Работа со строками, а затем со столбцами матрицы приводит к дублированию кода - PullRequest
0 голосов
/ 16 июня 2010

У меня есть следующий (Python) код, чтобы проверить, есть ли строки или столбцы, содержащие одинаковое значение:

    # Test rows ->  

        # Check each row for a win
        for i in range(self.height):                    # For each row ...

            firstValue = None                           # Initialize first value placeholder

            for j in range(self.width):                 # For each value in the row
                if (j == 0):                                # If it's the first value ...
                    firstValue = b[i][j]                        # Remember it
                else:                                       # Otherwise ...
                    if b[i][j] != firstValue:                   # If this is not the same as the first value ...
                        firstValue = None                           # Reset first value
                        break                                       # Stop checking this row, there's no win here

            if (firstValue != None):                    # If first value has been set
                                                            # First value placeholder now holds the winning player's code
                return firstValue                           # Return it

    # Test columns ->

        # Check each column for a win
        for i in range(self.width):                 # For each column ...

            firstValue = None                           # Initialize first value placeholder

            for j in range(self.height):                # For each value in the column
                if (j == 0):                                # If it's the first value ...
                    firstValue = b[j][i]                        # Remember it
                else:                                       # Otherwise ...
                    if b[j][i] != firstValue:                   # If this is not the same as the first value ...
                        firstValue = None                           # Reset first value
                        break                                       # Stop checking this column, there's no win here

            if (firstValue != None):                    # If first value has been set
                                                            # First value placeholder now holds the winning player's code
                return firstValue                           # Return it

Очевидно, здесь много дублирования кода. Как мне изменить этот код?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Обычно, если вы хотите выполнить рефакторинг, возьмите похожие фрагменты кода и превратите их в функции.Таким образом, у вас может быть функция для проверки всех ячеек, для которых один индекс (строка или столбец) одинаков, и другая функция, которая вызывает эту функцию для всех столбцов (или строк).Хотя, как отметил Пэр в комментарии к вашему вопросу, было бы намного легче помочь, если бы вы дали некоторую информацию о том, что вы пробовали.

Но ... другое отдельное (возможно, немного связанное)Дело в том, что ваш код не использует функциональные возможности Python.Это хорошо, но, как вы знаете, задачи, подобные этой, когда вам нужно проверить кучу различных элементов массива (на самом деле, списка), часто намного более кратки, когда написаны функционально.Например, ваш пример можно сделать так:

f = lambda x,y: x if x == y else False
# for Python <= 2.4 use this instead:
# f = lambda x,y: x == y and x or False
# test rows
[reduce(f,r) for r in array]
# test columns
reduce(lambda r,s: map(f,r,s), array)

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

2 голосов
/ 16 июня 2010

Чтобы проверить, все ли элементы в строке равны, я бы предложил построить питон set строки, а затем проверить, имеет ли он только один элемент. Аналогично для столбцов.

например. как это

def testRowWin(b):
    for row in b:
        if len(set(row)) == 1:
            return True
    return False

def testColWin(b):
    return testRowWin(zip(*b))
1 голос
/ 16 июня 2010
def test_values(self, first, second, HeightWidth):
    for i in range(first):
        firstValue = None
        for j in range(second):
            (firstDimension, secondDimension) = (i, j) if HeightWidth else (j, i)
            if secondDimension == 0:
                firstValue = b[firstDimension][secondDimension]
            else:
                if b[firstDimension][secondDimension] != firstValue:
                    firstValue = None
                    break
    return firstValue

firstValue = test_values(self, self.height, self.width, true)
if firstValue:
    return firstValue

firstValue test_values(self, self.width, self.height, false)
if firstValue:
    return firstValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...