行で動作し、次にマトリックスの列を操作すると、コードの複製が生成されます
-
27-09-2019 - |
質問
同じ値を含む行または列があるかどうかを確認するための次の(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
明らかに、ここには多くのコードの複製があります。 このコードをリファクタリングするにはどうすればよいですか?
ありがとう!
解決
一般的に、リファクタリングを行う場合は、同様のコードのスニペットを使用して、それらを関数にします。したがって、1つのインデックス(行または列)が同じであるすべてのセルをテストする関数を持つことができ、すべての列(または行)でその機能を呼び出す別の関数をテストできます。 Pärがあなたの質問についてのコメントで指摘したように、あなたが試したことについていくつかの情報を提供すれば、それははるかに簡単に役立つでしょう。
しかし...別の別の(おそらくわずかに関連する)問題は、コードが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)
コードの仕組みを理解しようとしている場合、それはそれほど役に立ちませんが。
他のヒント
連続してすべての要素が等しいかどうかを確認するには、Pythonを構築することをお勧めします set
行の1つの要素しかないかどうかを確認します。同様に列について。
たとえば、このように
def testRowWin(b):
for row in b:
if len(set(row)) == 1:
return True
return False
def testColWin(b):
return testRowWin(zip(*b))
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
所属していません StackOverflow