如何解决我的" list_reverseiterator'对象不是可订阅的"错误?

时间:2017-09-09 16:09:57

标签: python list loops iterable

我在这里找到了来自用户的这段代码并编辑它以获得我的游戏板:

rows = [[f'{(n+1) + (i*7):4}' for n in range(7)] for i in range(7)]
rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])

for row in rows:
    print(' | '.join(row))

这对我来说是一个完美的游戏板,7乘7:

  43 |   44 |   45 |   46 |   47 |   48 |   49
  42 |   41 |   40 |   39 |   38 |   37 |   36
  29 |   30 |   31 |   32 |   33 |   34 |   35
  28 |   27 |   26 |   25 |   24 |   23 |   22
  15 |   16 |   17 |   18 |   19 |   20 |   21
  14 |   13 |   12 |   11 |   10 |    9 |    8
   1 |    2 |    3 |    4 |    5 |    6 |    7

我可以稍微理解一下代码,我知道它使用了一个列表生成器以及它如何反转每一行......

但我也希望能够在棋盘上打印玩家的位置。例如,如果Player1位于主板上的第6位,我想打印出一块新主板,但只需用#34; P1"替换数字6。我遇到了错误"TypeError: 'list_reverseiterator' object is not subscriptable"

如何使用上面的代码执行此操作?我需要一个不同的解决方案来绘制电路板吗?

1 个答案:

答案 0 :(得分:2)

数字在第一个列表解析中生成,在f'..'字符串中:

f'{(n+1) + (i*7):4}'

这会将数字计算为(n + 1) + (i * 7),并将其格式化为宽度为4的列。如果您想在此处显示其他内容,则需要将 替换为 P1。如果您首先使用任何字符串格式生成数字,这会更容易:

playerpos = 6
numbers = (((n+1) + (i*7) for n in range(7)) for i in range(7))
rows = [[f'{"P1" if pos == playerpos else pos:>4}' for pos in row] for row in numbers]
rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])

numbers然后是生成数字的生成器的生成器,然后第一个rows表达式生成一个列表列表,格式化每个数字字符串P1如果号码与玩家位置匹配。

我在格式规范中添加了>;默认情况下,数字是右对齐的,但其他所有数据都是左对齐的。 >会覆盖并对齐所有内容,将P1置于与数字相同的位置。

演示:

>>> playerpos = 6
>>> numbers = (((n+1) + (i*7) for n in range(7)) for i in range(7))
>>> rows = [[f'{"P1" if pos == playerpos else pos:>4}' for pos in row] for row in numbers]
>>> rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])
>>> for row in rows:
...     print(' | '.join(row))
...
  43 |   44 |   45 |   46 |   47 |   48 |   49
  42 |   41 |   40 |   39 |   38 |   37 |   36
  29 |   30 |   31 |   32 |   33 |   34 |   35
  28 |   27 |   26 |   25 |   24 |   23 |   22
  15 |   16 |   17 |   18 |   19 |   20 |   21
  14 |   13 |   12 |   11 |   10 |    9 |    8
   1 |    2 |    3 |    4 |    5 |   P1 |    7