在Python 2.7中列出一个列表总和的总和?

时间:2015-04-13 15:23:53

标签: python list python-2.7 sum

这是我正在进行的工作的完整代码:

 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需要适用于多个类似性质的列表。谢谢你的帮助!

5 个答案:

答案 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)来保存内存。