我试图从前一个函数中获取值并在另一个函数中使用。这是我的第一个编程课程和语言,我完全迷失了。 我想出了如何从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
答案 0 :(得分:2)
变量astlist
是一个列表。您要多次添加list1
,这也是一个列表。但您每次都要向list1
添加一个列表:list1.append([x,y,z])
。所以最终astlist
是一个包含多个列表的列表,每个列表都包含一个包含三个整数的列表。
因此,当您编写x,y,z=astlist[row]
变量x
时,y
和z
实际上是列表,而不是整数。这意味着您正在尝试计算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对数据进行规范化,如果的确如此,那么我认为您会丢失一半。