如何找到游戏中元素的位置(列表)?



在这个游戏中,在由'o'表示的位置(0, 0(只有一个元素。其余的都被占用了。 编写一个函数 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列表,看看您是否找到了'o'是否有命中,然后将该元素坐标附加到result。我想指出的是,你的错误if not "o"总是正确的,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)]

这样的事情应该可以工作:

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':.

这个特殊的错误非常烦人,因为尽管缺少部分表达式,但由于称为真实性的东西,代码运行良好。真实性(及其对应的虚假性(是这样一种想法,即不是布尔值的东西可以转换为/评估为布尔值。在 Python 字符串的情况下,空字符串是假的(它们的计算结果为 False(,非空字符串是真实的(你明白了(。因此,代码中的 if 语句的计算方式如下:if not 'o':—>if not True:—>if False:。如您所知,该 if 语句的内容永远不会被执行。


以下是我将如何重写您的代码:

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()是一个简单且非常有用的函数,它返回由输入中的一个元素和一个计数器组成的对,计数器每次递增。当在列表中使用时,如上面的代码所示,它返回对应于(索引、元素(对的内容。

最新更新