【问题标题】:I am trying to iterate over the return value of a function which returns a tuple of 3 tuples我正在尝试迭代一个函数的返回值,该函数返回一个由 3 个元组组成的元组
【发布时间】:2018-08-06 02:43:00
【问题描述】:

我有一个称为网格的二维列表。

grid = [[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]]

动作列表:

actlist = [1,2,3,4]

还有一个二维列表:

U = [[0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]

还有一个名为 T 的函数,它接受 3 个整数作为参数。

def T(i,j,actions):

函数 T 如下所示: 这个函数的作用是,它接受 i,j 和动作并返回元组的元组,如下所示-

现在的问题是,当我尝试在 python 的内置 sum 函数中调用该函数时,在 for 循环中它显示错误。

它显示的错误是

我的问题是,如何使用 for 循环分别获取 3 个元组,我可以在每次迭代中使用一个元组中的所有三个值。 还有一件事,以下代码无法获取三个元组的单个值。

【问题讨论】:

  • 哪一行报错了?
  • 我面临的问题是函数的返回值。它返回一个由 3 个元组组成的元组。当我试图迭代调用函数的返回值时,它显示了 int object is not iterable 的错误。
  • q_value = sum(U[k][l]*p for (k,l,p) in T(i,j,a))

标签: python python-3.x sum tuples return-type


【解决方案1】:

您的 T 函数有时会返回一个包含三个元组的元组:

return (0,0,0.8),(1,0,0.1),(1,0,0.1)

……有时只是三个整数的元组:

return (-1,-1,1)

当您尝试迭代这三个值并将每个值解压缩为一个 3 元组时,有时这些值将是整数而不是 3 元组。这显然是行不通的。

不幸的是,我不能告诉你如何解决这个问题,因为我不知道这个函数应该做什么。也许你想要这个:

return (-1,-1,1), (-1,-1,1), (-1,-1,1)

……或者这样:

return (-1,-1,1),

……或者完全不同的东西。但我知道您想返回某种可迭代的 3 元组。


但与此同时,您的程序中至少还有三个其他严重错误。

首先,如果这些elif 条件都不为真,会发生什么?你只是从函数的末尾掉下来,这意味着你返回None,它不是一个三元组的可迭代对象。

第二:

elif(actions == "LEFT"):

你所有的其他测试都是针对一些名为LEFT 的常量。除非该常量恰好具有值 'LEFT',否则将不匹配。

第三:

if (actions == UP or DOWN or LEFT or RIGHT and i == 0 and j == 3):

… 意思是:

if (actions == UP) or (DOWN) or (LEFT) or (RIGHT and i == 0 and j == 3):

即使您通过添加括号来解决优先级问题:

if actions == (UP or DOWN or LEFT or RIGHT) and i == 0 and j == 3:

...这仍然没有用,因为UP or DOWN or LEFT or RIGHT 只是那些真实的(非零)中的第一个。

你可能想要这样的东西:

if actions in {UP, DOWN, LEFT, RIGHT} and i == 0 and j == 3:

【讨论】:

  • @AshishAcharya 你错了。在交互式 REPL 中尝试 x, y, z = 1:OP 不会尝试在任何地方索引与 T 的结果有关的任何内容,但他正在尝试将结果的每个元素解压缩到包含 3 个名称的目标列表中。跨度>
  • @AshishAcharya 是的。 for 迭代了三件事的元组。然后,对于这三件事中的每一个,它都将其解压缩到 (k,l,p) 中。如果东西是int,这不起作用,因为你不能迭代解包不可迭代的东西。
  • 我尝试了以下代码来获取三个元组的单个值。 (k1,l1,p1) (k2,l2,p2) (k3,l3,p3) = T(i,j,a)
  • @ShifatEArman 你为什么会这样?如果您的函数有时会返回一个包含三个整数的元组,有时还会返回 None,那么您如何期望该代码比您的原始代码更好地工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多