在多维列表中引用项目的正确方法是什么?

时间:2013-06-10 18:40:51

标签: python multidimensional-array python-3.x

我正在尝试编写一个命令行扫雷克隆,我在使用我的生成器代码时遇到了一些麻烦。

def genWorld(size, mines):
    world = []
    currBlock = []
    for i in range(size):
        for j in range(size):
            currBlock.append("x")
        world.append(currBlock)
        currBlock = []
    for i in range(mines):
        while True:
            row = randint(0, size)
            col = randint(0, size)
            if world[row[col]] != "M":
                break
        world[row[col]] = "M"
    printWorld(world)

当我运行时,我收到错误:

Traceback (most recent call last):
  File "C:\Python33\minesweeper.py", line 28, in <module>
    genWorld(9, 10)
  File "C:\Python33\minesweeper.py", line 23, in genWorld
    if world[row[col]] != "M":
TypeError: 'int' object is not subscriptable

我想这意味着我以错误的方式引用了这个列表,但是我怎么能正确地做这个呢?

3 个答案:

答案 0 :(得分:3)

您为row提供一个整数值。 row[col]然后尝试访问该整数的元素,这会产生错误。我想你想要的是world[row][col]

答案 1 :(得分:1)

您可能需要world[row][col],因为world[row]会提供一个列表,然后[col]会从该列表中选择一个元素。

答案 2 :(得分:0)

我会考虑使用dict而不是嵌套数组:

# positions for mines
mines = set()
while len(mines) != mines:
    pos = (randint(0, size), randint(0, size))
    if not pos in mines:
        mines.add(pos)

# initialize world
world = {}
for x in range(size):
    for y in range(size):
        if (x, y) in mines:
            world[x, y] = 'M'
        else:
            world[x, y] = ' '

你也可以使用dict的get()函数,如果没有我的函数会返回None,但是你也可以使用集合(if pos in mines: booom())来保持容易。< / p>