在此游戏中,只有一个元素在(0,0)处以'o'表示,其余元素被占用。编写一个函数empty(game),该函数接收一个游戏并给出所有空白区域的位置列表。每个位置由(i,j)指定。例如,
game = [['o', 'x', 'x'],
['x', 'x', 'x'],
['x', 'x', 'x']]
空(游戏)给出[(0,0)]
def empty_spaces(game):
result = [0]
num_of_rows = len(game)
num_of_columns = len(game[0])
for i in range(num_of_columns):
for j in range(num_of_rows):
if not "o":
result += i[j]
return result
但是,我得到的结果是[0]。非常感谢您的帮助,非常感谢!
类似这样的方法应该起作用:
game = [['x', 'x', 'o'],
['x', 'o', 'x'],
['x', 'x', 'o']]
def empty_spaces(board):
result = []
for r_index, row in enumerate(board):
for c_index, column in enumerate(row):
if 'o' in column:
result.append((r_index, c_index))
return result
print(empty_spaces)
>>> [(0, 2), (1, 1), (2, 2)]
问题出在语句if not 'o':
上。
对于我们人类来说,很明显,在程序上下文中,我们要检查索引(i,j)处的元素是否为字符串'o'
。
不幸的是,Python的性质和局限性意味着我们必须明确而具体:if game[i][j] == 'o':
。
这个特定的错误非常令人讨厌,因为尽管表达式的一部分丢失了,但是由于称为真实性的原因,代码运行得很好。 Truthyness(及其对应的fassyness)是一种想法,即非布尔值的事物可以转换为/评估为一个。对于Python字符串,空字符串是虚假的(它们的评估结果为False),非空字符串是真实的(您知道了)。因此,代码中的if语句的计算方式如下:if not 'o':
—>if not True:
—> if False:
。如您所知,if语句的内容将never执行。
这是我将如何重写您的代码:
game = [['o', 'x', 'x'],
['x', 'x', 'x'],
['x', 'o', 'x']]
def empty_indexes(board):
index_list = []
for row_idx, row in enumerate(board):
for col_idx, elem in enumerate(row):
if elem == 'o':
index_list.append((row_idx, col_idx))
return index_list
enumerate()
是一个简单且极为有用的函数,它返回由输入中的一个元素和一个计数器组成的对,该计数器每次递增。当在列表中使用时,就像上面的代码一样,它返回对应于(索引,元素)对的内容。
您已遍历game
列表,看是否找到'o'
是否有匹配项,然后将该元素坐标附加到result
。我想指出的错误是if not "o"
始终为true,result=[0]
您不想这样做。而是简单地写result= []
或result= list()
。代码中的result+= i[j]
i
不可迭代,它是整数。由于我们检查每个元素是否均等于"o"
,因此时间复杂度为O(rows*columns)
。
game = [['o', 'o', 'x'],
['x', 'x', 'x'],
['x', 'x', 'o']]
result=[]
for i in range(len(game)):
for j in range(len(game[i])):
if game[i][j] == 'o':
result.append((i,j))
print(result)
>>> [(0, 0), (0, 1), (2, 2)]