在 python 中解包一个元组并对其进行迭代

Posted

技术标签:

【中文标题】在 python 中解包一个元组并对其进行迭代【英文标题】:Unpacking a tuple in python and iterating over it 【发布时间】:2016-01-03 17:20:01 【问题描述】:

我正在尝试解压缩一个坐标元组,然后对其进行迭代以多次对精灵进行 blit:

def updateMap(self, playerPosition):

  self.x_coord, self.y_coord = playerPosition 

  t = Tree(self.screen)
  for x in range(self.x_coord):
    for y in range(self.y_coord):
      self.screen.fill((0,104,0))
      t.drawTree((x, y))

但是我得到以下错误:

File "unnamed.py", line 26, in updateMap
  for x, y in range(self.x_coord), range(self.y_coord):
ValueError: need more than 0 values to unpack

如果有人能以正确的方式为我指明正确的方向,我将不胜感激。谢谢。

编辑:我已经将我的代码编辑到上面来迭代每个坐标,比如 playerPostion 是否为 0,5,所以迭代为 (0,1) (0,2) (0,3) (0,4) ( 0,5) - 但是虽然我没有收到任何错误,但树似乎没有正确绘制。谢谢..这似乎是答案,除了我的编码是错误的。

【问题讨论】:

我没有真正看到元组,你想遍历 x,y 的所有可能组合吗? @WillemVanOnsem ..正确,我有点紧张...我在这里没有看到任何元组,我只是在查看错误消息.. playerPostion 是一个元组——如果 playerPosition 是 (0,5) 例如我想在 0,0 0,1 0,2 0,3 等上绘制树 self.x_coordself.y_coord 总是0 ? @IronFist 是的,我不知道这是怎么回事? 【参考方案1】:

我认为这是你想要的:

from itertools import product

self.x_coord, self.y_coord = playerPosition #playerPosition is a tuple

t = Tree(self.screen)
for x,y in product(range(self.x_coord+1), range(self.y_coord+1)):
    self.screen.fill((0,104,0))
    t.drawTree((x, y))

【讨论】:

在我看来,在这种情况下,可以更好地确定最小值,因为 xy 将始终相同。 @zzoop...请考虑接受对您帮助最大的答案【参考方案2】:

我认为 OP 想要遍历 X 坐标的范围和 Y 坐标的范围,以便为每种情况创建一个 (x,y)。

for x in range(self.x_coord):
    for y in range(self.y_coord):
        print(x, y)

【讨论】:

【参考方案3】:

假设两个可迭代对象的长度相同,请使用内置的 Python zip 函数。如果没有,那么您需要先进行一些消毒,以确保它们是。

for x, y in zip(range(self.x_coord), range(self.y_coord))

【讨论】:

这不会遍历所有坐标,但假设这就是问题所要寻找的 这不是预期的结果。 OP 肯定想要嵌套迭代。 这是我对他们在寻找什么的最佳猜测。 @ColinSchoen ..我是第一个向您发布类似答案的人,但在仔细阅读代码后,我意识到这不是 OP 意图并删除了我的答案..【参考方案4】:

也许如果你改变:

self.x_coord = 0 
self.y_coord = 0 
playerPosition = self.x_coord, self.y_coord

到:

self.x_coord, self.y_coord = playerPosition

然后你将玩家位置 x 和 y 放入 self.x_coord 和 self.y_coord

要遍历 x 和 y 的每个组合,您需要在 x 范围内的循环内放置一个 y 范围内的循环

for x in range(self.x_coord):
    for y in range(self.y_coord):
        self.screen.fill((0,104,0))
        t.drawTree((x, y))

【讨论】:

以上是关于在 python 中解包一个元组并对其进行迭代的主要内容,如果未能解决你的问题,请参考以下文章

从 RDD 中的元组中解包项目时出现 Spark 错误

ValueError:没有足够的值来解包(预期为 2,得到 1)当试图在 python 中解包 dict 以使用 pandas 进行数据标记时

Python中的参数解包:`*`表达式和`**`表达式

返回语句中的 Python 元组解包

在python中解包元素

PYTHON * 和**的用法