如何遍历嵌套列表以将每个列表从1编号为5:

时间:2012-09-28 00:14:06

标签: python list loops for-loop

所以我正在制作一个分配游戏,我需要制作一个函数,它接受一个代表游戏板的嵌套列表,每行从1到5的数字(对于坐标,例如F4,G3等)

比如说代表董事会的清单如下:

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

我需要为每个列表的第一个位置添加一个数字,所以我得到的内容如下:

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

并显示如下:

1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S

我目前的做法是这样的:

def display_board(board):
     bottomLetters  = [" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
     print board
     counter = int(0)
     for row in board:
         counter += int(1)
         row.insert(0, counter)
         for positon in row:
             print positon,
             print

这几乎可行,但我得到一个奇怪的输出:

1 S S X S S
2 . . . . .
3 . . T . .
4 2 . . . . .
5 S S Y S S

或只是游戏板列表本身:

board = [[1, 'S', 'S', 'X', 'S', 'S'],
         [4, 2, '.', '.', '.', '.', '.'],
         [3, '.', '.', 'T', '.', '.'],
         [4, 2, '.', '.', '.', '.', '.'],
         [5, 'S', 'S', 'Y', 'S', 'S']]

有人知道为什么会这样吗?

4 个答案:

答案 0 :(得分:3)

不是真的答案 - 而是一些建议。

您不需要int(0)就可以使用0。此外,Python已经提供了一个内置方法,用于在名为enumerate的序列中“编号”项目。另请参阅str.join方法,以便更容易打印格式化文本。

使用上述内容,您可以将代码缩减为:

board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]

def display_board(board):
    for rowno, items in enumerate(board, start=1):
        print rowno, ' '.join(items)

display_board(board)

这不仅是更多的Pythonic,而且更清楚你的意图。

答案 1 :(得分:1)

我似乎无法复制你的结果,但这里突出的问题是你每次运行display_board()时都要修改电路板(在计数器前面)。任何希望您的电路板采用原始格式的代码一旦显示就会中断。

以下是我如何处理它:

def display_board(board):
  for counter, row in enumerate(board, start=1):
    print counter, " ".join(row)
  print " ".join(" ABCDEFGHIJK"[:len(board[0])+1])

示例输出:

>>> display_board(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E

答案 2 :(得分:1)

您收到此错误的原因是您向我们展示的主板实际上并不像您定义的那样...我是否正确?

注意第二行和第四行看起来是一样的。在您的数据结构中,它们最终是完全相同的对象,这就是为什么修改第二行也会影响第四行。

您是否以任何方式单独初始化行,然后将它们分配给电路板,重复第二行?在这种情况下,请注意您并非复制它们,而是实际存储对同一对象的引用。

答案 3 :(得分:0)

我不会改变数据结构只是为了节省一些显示它的工作并同时打破逻辑。数字不是董事会的一部分,不应与游戏数据混在一起。我会做类似的事情:

In [1]: %paste
board = [['S', 'S', 'X', 'S', 'S'],
         ['.', '.', '.', '.', '.'],
         ['.', '.', 'T', '.', '.'],
         ['.', '.', '.', '.', '.'],
         ['S', 'S', 'Y', 'S', 'S']]
## -- End pasted text --

In [2]: from string import ascii_uppercase

In [3]: def display(b):
    for i, row in enumerate(b, 1):
        print i, ' '.join(row)
    print ' ', ' '.join(x for _, x in zip(row, ascii_uppercase))

In [4]: display(board)
1 S S X S S
2 . . . . .
3 . . T . .
4 . . . . .
5 S S Y S S
  A B C D E