【问题标题】:Make a sum of sum of lists in Python 2.7?在 Python 2.7 中求和列表的总和?
【发布时间】:2015-04-13 15:23:52
【问题描述】:

这是我正在进行的工作的全部代码:

 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 需要为多个类似性质的列表工作。感谢您的帮助!

【问题讨论】:

  • 这应该可以帮助您解决“浮动对象不可迭代”错误! sum([sum(float(x) for x in lengthList)])祝你好运!

标签: python list python-2.7 sum


【解决方案1】:

这应该可以帮助您解决“浮动对象不可迭代”错误!

编辑:

在forloop之上声明以下内容

长度列表=[]

在for循环的最后一个else部分

lengthList.append(sum(float(x) for x in lengths(trace)))

在for循环之外

打印 [sum(float(x) for x in lengthList)]

祝你好运!

【讨论】:

  • 嘿,我试过了,它有效!问候。 p.s.:你可以在空闲时解决它,如果它抛出错误,请报告。对我来说,它工作得很好。
  • 嗨@AlekhyaVemavarapu。我试过了,它给了我 sum(lengthLists) 输出。不是 sum(lengthLists) 的总和。
  • 我可以知道你到底需要什么吗?因为我并没有真正得到你的问题,所以努力解决你提到的错误。问候。
  • 我需要很快产生的输出:22436.59108938537。总和(总和(长度列表))。
【解决方案2】:

我做了两处修改。在函数外更改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)

【讨论】:

    【解决方案3】:

    你可以使用list comprehension:

    sum([sum(x) for x in lengthList])
    

    这将对lengthList中的点值求和,然后返回这些总和的总和。

    或者正如@soon 指出的那样,generator

    sum(sum(x) for x in lengthList)
    

    虽然如果你想使用任何列表方法,你应该使用列表推导式。

    【讨论】:

    • 没有理由理解列表 - 只需使用像 sum(sum(x) for x in [[1, 2, 3], [4, 5, 6]])map 这样的生成器函数。
    • @Tui Popenoe 我不断收到错误'float' object is not iterable。不过感谢您的帮助。
    • 您在lengthList 中的所有点是否都定义为列表/元组?或者是用浮点数表示的单个值(听起来像是在发生什么)
    • 为什么需要列表方法? Sum 将返回一个 int/float。
    • 如果您想在汇总子列表之前修改子列表。
    【解决方案4】:

    只需列出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
    

    【讨论】:

      【解决方案5】:

      如果你只想计算所有走线的总长度,你应该首先计算所有走线的长度:

      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)来节省内存。

      【讨论】:

      • 我需要以我所拥有的形式存储的长度,因为我稍后会为更复杂的功能使用单独的走线长度。不幸的是,我无法在不危及其余代码的情况下更改当前代码的组成。我强烈简化了我的原始代码,只显示我坚持的部分。
      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2023-01-12
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多