这是我正在进行的工作的完整代码:
nList = [[[0,0,4287320],[10423234600,0,63248900]],\
[],\
[[132447000,10432900,134820]],\
[[0,0,0],[3002340,4324000,303420],[3003420,40023420,720424],[0,0,102432420]],\
[[132432450,0,0],[10034220,0,36432230], [400432240,40243200,6432260],[4000423, 40243200, 964234240],[12342400,0,132342420]]]
解码列表: nList有多条迹线,trace1有两个点,trace2没有点,trace3有1个点,所以一个。迹线中的每个点由三个元素组成[x坐标,y坐标,时间。
在整个代码的最后,我需要打印sum(sum(lengthList))
,这个公式显然不起作用。问题是,我也尝试了print map(sum(sum, lengthList))
,print sum(sum(lengthList))
,但没有一个有效。它也必须是一个函数,而不仅仅是一个打印,因为nList需要适用于多个类似性质的列表。谢谢你的帮助!
答案 0 :(得分:2)
这可以帮助你从"浮动对象不可迭代"错误!
修改强>
在forloop
之上声明以下内容lengthList = []
和for循环的最后一部分
lengthList.append(sum(float(x)for x in length(trace)))
支持for循环
print [sum(float(x)for x in lengthList)]
祝你好运!
答案 1 :(得分:1)
您可以使用list comprehension:
sum([sum(x) for x in lengthList])
这将对lengthList中的点值求和,然后返回这些和的总和。
或者@soon指出,generator:
sum(sum(x) for x in lengthList)
虽然如果你想使用任何列表方法,你应该使用列表推导。
答案 2 :(得分:1)
只需列出lengthList = []
列表,然后按extend
您可以在上一个for loop
lengthList = []
for i in range(len(traceList)):
trace=traceList[i]
if len(trace)==0:
print "Trace {0} has no points!".format(i)
elif len(trace)==1:
print "Trace {0} consists of a single point.".format(i)
else:
#lengthList=lengths(trace)
lengthList.extend(lengths(trace))
print sum(lengthList)
输出
Trace 1 has no points!
Trace 2 consists of a single point.
22436.5910894
答案 3 :(得分:1)
我做了两次修改。在函数外部更改length_list。
length_list=[]
def lengths(trace):
sum_of_all_lengths=[]
for i in range(0,len(trace)-1):
length=calculateLength(trace[i][0], trace[i][1], trace[i+1][0], trace[i+1][1])
length_list.append(length)
return length_list
最后你可以拥有这个
print sum(length_list)
答案 4 :(得分:1)
如果您只想计算所有迹线的总长度,首先应计算所有迹线的长度:
In [9]: lengths_of_all_traces = map(lengths, (trace for trace in traceList if len(trace) > 1))
In [10]: lengths_of_all_traces
Out[10]: [[1000.0], [5000.0, 0.0, 5000.0], [850.0, 5000.0, 0.0, 5586.591089385369]]
如您所见,我们跳过零点或一点的痕迹。
下一步是计算总长度。您可以将生成器表达式传递给sum
函数:
In [11]: total_length = sum(sum(t) for t in lengths_of_all_traces)
In [12]: total_length
Out[12]: 22436.59108938537
实际上,您可以删除条件if len(trace) > 1
,因为sum
可以很好地处理空列表:
In [13]: lengths_of_all_traces = map(lengths, traceList)
In [14]: lengths_of_all_traces
Out[14]:
[[1000.0],
[],
[],
[5000.0, 0.0, 5000.0],
[850.0, 5000.0, 0.0, 5586.591089385369]]
In [15]: total_length = sum(sum(t) for t in lengths_of_all_traces)
In [16]: total_length
Out[16]: 22436.59108938537
您也可以使用imap
函数(返回迭代器)而不是map
(返回list
)来保存内存。