如何解决我的“list_reverseiterator”对象不可下标”错误?

Posted

技术标签:

【中文标题】如何解决我的“list_reverseiterator”对象不可下标”错误?【英文标题】:How can I solve my "list_reverseiterator' object is not subscriptable" error? 【发布时间】:2018-02-18 07:55:25 【问题描述】:

我在这里从一位用户那里找到了这段代码并对其进行了编辑以获取我的游戏板:

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 x 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,我想打印出一个新棋盘,但只需将数字 6 替换为“P1”。我遇到了错误"TypeError: 'list_reverseiterator' object is not subscriptable"

我怎样才能用上面的代码做到这一点?我需要不同的解决方案来绘制电路板吗?

【问题讨论】:

然后请包含产生异常的代码,以便我们更正它。 【参考方案1】:

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

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

这会将数字计算为(n + 1) + (i * 7),并将其格式化为宽度为 4 的列。如果您想在此处显示其他内容,则需要将 that 替换为 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 if数字与玩家位置相符。

我在格式规范中添加了>;默认情况下,数字是右对齐的,但其他所有内容都是左对齐的。 > 覆盖并右对齐所有内容,将 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

【讨论】:

很好的解释,正是我想要的。你能解释一下表达式 f'...' 中的“f”是什么意思吗? @user766559:这是一个格式化的字符串文字;见docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498

以上是关于如何解决我的“list_reverseiterator”对象不可下标”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何向我的团队项目添加新解决方案?

为啥我的收藏视图在向下或向上滚动时很慢?如何解决性能问题?我已经清理了我的 UI 代码

为啥我的解决方案这么慢,如何提高查询的性能?

我的 Json 数组只返回最后一个数组。如何解决?

Codeforces 解决方案中超出时间限制。如何改进我的解决方案?

如何解决这种循环依赖?