如何在python2.7中从元组列表中找到最大值?

2024-06-07 16:44:02 发布

您现在位置:Python中文网/ 问答频道 /正文

到目前为止我有一个代码:

import math

nList = [[[0,0,0],[3,2,1]],\
[[]],\
[[1,1,12]],\
[[0,0,0],[30000,40,3010],[32000,40500,7520],[0,0,10520]],\
[[15340,0,0],[104300,0,3630], [434000,4434000,63460],[400340, 404300, 9430],[10340,0,1334320]]]



MaxLengthPerTrace=[[]]

traceCount = len(nList)
prevX = 0
prevY = 0
prevT = 0
maxLengthTempList=0

def calculateLength(x1, y1, x2, y2):
    return math.sqrt((x1-x2)**2 + (y1 - y2)**2)
def calculateTime (t1,t2):
    return abs(t1-t2)

#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 = point[0]
            tempY = point[1]
            tempT = point[2]

            if pointIndex != 0:

                #Calulate Length here
                length = calculateLength(tempX, tempY, prevX, prevY)
                print length


                #Calculate Maximum Length here

我该如何编写一个程序来计算长度的最大值?我为此编写了伪代码

        if(length > max)
            max = length;   

        add the length in MaxLengthPerTrace in index of traceindex

但似乎无法在python2.7.10中正确执行它。任何帮助都将不胜感激。谢谢!你知道吗

我试了一下,但没有成功,出现了一个错误:“因为我的长度: TypeError:“float”对象不可iterable

for i in length:
                if i >length:
                    i=length
                    MaxLengthPerTrace.append(i)
                    print MaxLengthPerTrace

Tags: 代码inforleniftracemathlength
3条回答

我对你的代码做了一点小小的改动,只是为了消除你陷入困境的地方。但是这种编写程序的方法是非常不清楚的。我强烈建议在这里增强其他人的功能性解决方案,而不是改进类似C风格的代码。你知道吗

import math

nList = [[[0,0,0],[3,2,1]],\
[[]],\
[[1,1,12]],\
[[0,0,0],[30000,40,3010],[32000,40500,7520],[0,0,10520]],\
[[15340,0,0],[104300,0,3630], [434000,4434000,63460],[400340, 404300, 9430],[10340,0,1334320]]]



MaxLengthPerTrace=[[]]

traceCount = len(nList)
prevX = 0
prevY = 0
prevT = 0
maxLengthTempList=0

def calculateLength(x1, y1, x2, y2):
    return math.sqrt((x1-x2)**2 + (y1 - y2)**2)
def calculateTime (t1,t2):
    return abs(t1-t2)

#Entry point
def getLengths():
    for traceIndex in range(0, len(nList)):
        print 'trace: ' + str(traceIndex+1)

        trace = nList[traceIndex]
        def getLenthsForElement():
            for pointIndex in range(0, len(trace)):
                point = trace[pointIndex]

                if len(point)>0:
                    tempX = point[0]
                    tempY = point[1]
                    tempT = point[2]

                    if pointIndex != 0:

                        #Calulate Length here
                        length = calculateLength(tempX, tempY, prevX, prevY)
                        yield length
        yield [l for l in getLenthsForElement()]                

#print the list of lists of weights
print [l for l in getLengths()]
#flatten all lists and get maximum.
lens = []
[lens.extend(l) for l in getLengths()]
print max(lens)

列出长度,然后得到最大值:

lengths = []
for point in trace:
    lengths.append(calculateLength(point[0], point[1], prevX, prevY));

maxLength = max(lengths)
print maxLength

希望你的代码能帮上忙。你知道吗

对于generator,这是一个很好的例子。您有一个iterable(traces),想要做一些相当复杂的事情来创建一个新的iterable(length):

nList = [[[0, 0, 0], [3, 2, 1]],
         [[]],
         [[1, 1, 12]],
         [[0, 0, 0], [30000, 40, 3010], [32000, 40500, 7520], [0, 0, 10520]],
         [[15340, 0, 0], [104300, 0, 3630], [434000, 4434000, 63460],
          [400340, 404300, 9430], [10340, 0, 1334320]]]

def calculate_length(x1, y1, x2, y2):
    return math.sqrt((x1-x2)**2 + (y1 - y2)**2)

def calculate_time (t1,t2):
    return abs(t1-t2)

def lengths(traces):
    previous_x, previous_y = 0, 0
    for trace in traces:
        for index, point in enumerate(trace):
            if point:
                x, y, t = point
                if index > 0:
                    yield calculate_length(x, y, previous_x, previous_y)
                previous_x, previous_y = x, y  # Was this intended?

print(max(lengths(nList)))

在代码中,您从未设置prevXprevY,我认为这是一个bug。我猜你想要什么。你知道吗

请注意我所做的更改—首先,在Python中按索引迭代是缓慢的、不可读的,而且通常不是一个好主意—Python for循环直接在iterables上迭代,不需要计数。如果您需要索引(在第二种情况下检查它是否不是第一个值),我们也可以使用enumerate()来获得它。你知道吗

一旦我们有了一个长度的iterable,使用max()内置函数获得最大长度就很简单了。你知道吗

如果希望每个跟踪的最大长度,而不是整个数据集的长度,可以简单地更改函数的工作级别(删除最外层的循环并将输入参数更改为trace),然后在list comprehension内调用它,例如:

def lengths(trace):
    previous_x, previous_y = 0, 0
    for index, point in enumerate(trace):
        if point:
            x, y, t = point
            if index > 0:
                yield calculate_length(x, y, previous_x, previous_y)
            previous_x, previous_y = x, y

print([max(lengths(trace)) for trace in nList])

最后,我还将代码样式更改为匹配PEP8——这并不重要,但它有助于使您的代码与您将发现的大多数示例保持一致,并使您更容易一眼就识别出内容。这主要意味着我已经重命名了变量。你知道吗

相关问题 更多 >

    热门问题