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

时间:2014-11-22 23:14:36

标签: python typeerror

我试图从前一个函数中获取值并在另一个函数中使用。这是我的第一个编程课程和语言,我完全迷失了。 我想出了如何从astlist获取变量并将它们放入函数距离,但现在Python告诉我,我不能在等式中使用这些变量,因为它们现在列在一个列表中?这是它的意思吗? 我还打印列表以查看它们是否正在运行。这是我的两个函数,函数都在我的main函数中定义。 我拿这些列表并最终将它们放入文件中,但我需要弄清楚为什么这个等式不能先工作。谢谢!

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

3 个答案:

答案 0 :(得分:2)

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

因此,当您编写x,y,z=astlist[row]变量x时,yz实际上是列表,而不是整数。这意味着您正在尝试计算x**2,但x是一个列表,而不是数字。这就是Python为您提供错误消息的原因,因为**不支持将列表提升为电源。

我不确定你要用所有这些列表完成什么,但你应该更改代码,这样你才会尝试将数字提升到2而不是列表。

答案 1 :(得分: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(列表列表列表)的重复列表

list1可能是多余的,您可能只想

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循环遍历序列(或其他可迭代值)的成员,而不仅仅是一个简单的计数器。您使用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

希望这有帮助

答案 2 :(得分:0)

我将引用特定的类型错误(TypeError:**或pow():'list'和'int'不受支持的操作数类型),由于某些原因,数组是可加操作的对象,例如加法:sum (array),但功效:array ** 2,pow(array,2)。您可以按照以下一些额外步骤来解决此问题:

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

我也建议使用求和函数

sum(x,y,z)

记住所有这些都是为了避免您所指的错误消息

这样,您可以将2的幂应用于数组中的每个元素,获得一个新的数组,并避免了您寻求帮助的错误消息。在我看来,您正在寻求使用范数L2对数据进行规范化,如果的确如此,那么我认为您会丢失一半。