TypeError:不支持**或pow()的操作数类型:“list”和“int”

2024-09-30 14:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从上一个函数中获取值并在另一个函数中使用。这是我的第一门编程课程和语言,我完全迷路了。 我想好了如何从astlist中获取变量并将它们放到函数距离中,但是现在Python告诉我不能在等式中使用这些变量,因为它们现在在列表中?这就是它的意思吗? 我也只是打印列表看看它们是否在运行。这是我的两个函数,这两个函数都是在我的主函数中定义的。 我会把这些列表放到文件里,但我需要先弄清楚为什么这个方程不起作用。谢谢!

def readast():

    astlist = []
    for j in range(15):
        list1 = []

    for i in range(3):
        x = random.randint(1,1000)
        y = random.randint(1,1000)
        z = random.randint(1,1000)
        list1.append([x,y,z])
        astlist.append(list1)
    print(astlist)
    return astlist

def distance(astlist):

    distlist = []
    for row in range(len(astlist)):
        x, y, z = astlist[row]
        x1 = x**2
        y2 = y**2
        z2 = z**2
        equation = math.sqrt(x+y+z)
        distlist.append(equation)
        print(distlist)
        return distlist

Tags: 函数in列表forreturndefrangerandom
3条回答

变量astlist是一个列表。您多次将list1添加到其中,这也是一个列表。但你每次都要给list1添加一个列表:list1.append([x,y,z])。所以最终astlist是一个包含多个列表的列表,每个列表都包含一个包含三个整数的列表。

所以当你写x,y,z=astlist[row]时,变量xyz实际上是列表,而不是整数。这意味着您试图计算x**2,但x是一个列表,而不是一个数字。这就是为什么Python会给您一条错误消息,因为**不支持将列表提升为power。

我不知道你想用这些列表来完成什么,但是你应该改变代码,这样你只想把数字提高到两个的幂,而不是列表。

我将引用特定的类型错误(type error:upported operand type for**或pow():'list'和'int'),因为某些原因,数组是诸如加法:sum(array)等操作的iterable对象,但是,power:array**2,pow(array,2)。您可以通过以下一些额外步骤来解决此问题:

x1 = [j**2 for j in x]

我也建议使用sum函数

sum(x,y,z)

记住这一切是为了避免你提到的错误信息

这样,就可以对数组中的每个元素应用2的幂,从而获得一个新数组,并避免出现请求帮助的错误消息。在我看来,你正在寻找一个规范化的数据使用规范二级,如果这是真的,那么,我认为你错过了一半。

这里有几个问题: 首先,位于readast()顶部的循环将list1设置为[]15次-我不确定您在这里要做什么。如果您试图生成15组x,y,z坐标,那么这是第二个range-在您的示例中range(3) -你需要改变。

然后继续将[x,y,z]的列表添加到(相同的)list1,然后将list1的整个添加到astlist。但是,Python实际上会将一个指针存储到列表中,而不是将一个副本存储到列表中,因此当您将项添加到list1时,它会将项添加到list1,其中list1包含在另一个列表中: 在本例中,为了清楚起见,随机数被序列号替换(第一个随机数是1,第二个是2,依此类推):

第一个循环后:

list1: [[1,2,3]]
astlist: [[[1,2,3]]]

第二个循环后:

list1: [[1,2,3],[4,5,6]]
astlist: [[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]

等等

如您所见,list1现在是列表列表,astlist现在是list1的副本列表(列表列表)

列表1可能是多余的,您可能只需要

astlist.append([x,y,z])

在第一点。

在第二个函数中,使用

for row in range(len(astlist)):
   x,y,z=astlist[row]
   ...

但事实上,以下情况会更好:

for row in astlist:
   x,y,z=row
   ...

甚至:

for x,y,z in astlist:
   ...

当Python中的for循环遍历序列(或其他iterable值)的成员时,它就不仅仅是一个简单的计数器。使用range(len(astlist))构造实际上是生成一个列表[1,2,3…]并对其进行迭代。

如果您特别需要一个数字索引,那么可以使用enumerate函数,该函数返回一系列(索引、值)对,您可以对这些对进行迭代:

for i,value in enumerate(['apple','banana','cherry']):
    print 'value {} is {}'.format(i,value)


 value 0 is apple
 value 1 is ball
 value 2 is cherry

希望这有帮助

相关问题 更多 >