在Python 2.7中计算和存储函数输出?

时间:2015-04-11 14:11:49

标签: python function python-2.7 for-loop printing

我有这样的代码:

nList = [[[0,0,0],[100420,0,623400]],\
[[]],\
[[100043,1324000,123240]],\
[[0,0,543],[3002340,443000,34300],[334000,4043400,7342],[0,0,134020]]
import math
prevX, prevY, prevT = 0, 0, 0

#Entry point
for traceIndex in range(0, len(nList)):
    print 'trace: ' + str(traceIndex+1)
    trace = nList[traceIndex]
    for pointIndex in range(0, len(trace)):
        point = trace[pointIndex]
        if len(point)>0:
            tempX, tempY, tempT = point[0], point[1], point[2]
            if pointIndex != 0:
           #calculate time difference here
                timeDiff = calculateTime (tempT,prevT)

基本上,nList在每个\被调用的跟踪之前都有子列表,每个跟踪都有三个元素的点。例如,nList[0][0]产生迹线1,点1 = [0,0,0]point=[x-coordinate, y-coordinate, time]。我计算了每条轨迹中每个点的timeDiff。现在我需要总结不同痕迹的timeDiff并打印出来以便:

trace: 1
623400
trace: 2
trace: 3
trace: 4
187393

nList由名为&#39; trace&#39;的子列表组成。每个跟踪&#39;具有一个或多个具有3个元素的点,[x,y,t]。例如,trace1有2个点,使trace1point1 = [0,0,0]和trace1point2 = [100420,0,623400]。 timeDiff计算t2和t1之间的差异。对于trace1,这将是(623400-0)。跟踪4与跟踪1相比具有更多的点,timeDiff将用于具有1=<N=<4,(34300-543),(7342-34300)和(134020-7342)的单个trace4pointN。我想编写一个程序,在每个跟踪中占用所有timeDiff,并以产生上述输出的方式对它们进行求和。

2 个答案:

答案 0 :(得分:2)

使用zip更容易解决这个问题,并直接在元素上迭代,以避免在变量中存储太多内容。根据您的示例输出,您需要每个时间点之间的绝对差异:

traces = [[[0,0,0],[100420,0,623400]],\
[[]],\
[[100043,1324000,123240]],\
[[0,0,543],[3002340,443000,34300],[334000,4043400,7342],[0,0,134020]]]
TIME_INDEX = 2  
traceCounter = 1
for trace in traces:
    print "trace:", traceCounter
    traceCounter += 1

    if len(trace[0]) < 2:
       #no coordinate in first element of trace, nothing to do
       continue

    #Zip takes several lists as arguments and returns list of lists with every 0th element in the 0th list, every 1st element in the 1st list etc. 
    timeStamps = zip(*trace)[TIME_INDEX]


    sumOfTimeDiffs = sum([abs(y-x) for x, y in zip(timeStamps[:-1], timeStamps[1:])] )

    if sumOfTimeDiffs > 0:
       print sumOfTimeDiffs

输出:

trace: 1
623400
trace: 2
trace: 3
trace: 4
187393

答案 1 :(得分:1)

   nList = [[[0,0,0],[100420,0,623400]],\
         [[]],\
         [[100043,1324000,123240]],\
         [[0,0,543],[3002340,443000,34300],[334000,4043400,7342],[0,0,134020]]]
    for trace in nList:
        list1=list()
        trace_index = nList.index(trace)
        print "trace%d"%(trace_index+1)
        if len(trace)>1:
            for point in trace:
                list1.append(point[2])

            list2 = list1[1:]
            list1.pop()
            output = (abs(i2 - i1) for i2,i1 in zip(list2,list1))
            print(sum(output))

这应该有效。基本上我通过提取迹线每个点的时间来形成一个列表。然后形成了相同的重复列表。从一个列表中删除第一个元素,从另一个列表中删除最后一个然后减去列表。在结果列表中添加元素会给出输出。