2015-04-11 2 views
0

У меня есть код с все это до сих пор:Как найти максимальное значение из списка кортежей в Python 2.7?

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 

, но не похоже, чтобы выполнить его в Python 2.7.10 правильно. Любая помощь будет оценена по достоинству. Благодаря!

Я попытался это, но он не работает, приходя с ошибкой: «для г Длина: TypeError:„Поплавок“объект не Iterable»

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

Макс будет максимальная длина от длин, определенных в функции: длина => Защиту calculateLength (x1, y1, x2, y2): возвращение Math.sqrt ((x1-x2) ** 2 + (y1 - y2) ** 2) ... calculateLength (tempX, tempY, prevX, prevY) – Jayden

+0

Как вы представляете точку в пространстве?Только с двумя координатами или с тремя координатами? –

+0

Точка - это три координаты, поэтому [0,0,0] в 1-ом примере. – Jayden

ответ

2

Ваш код, кажется, есть несколько проблемы, поэтому мне придется сделать несколько догадок, но, надеюсь, это помогает.

Это хороший пример для generator. У вас есть итератор (следы), и вы хотите сделать что-то достаточно сложное, чтобы создать новую итерацию (длины):

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))) 

В коде, вы никогда не заходили prevX и prevY, который я предполагаю, это ошибка , Я догадался, что вы хотите здесь.

Обратите внимание на внесенные мной изменения - во-первых, итерация по индексу в Python происходит медленно, нечитабельно и, как правило, никогда не бывает хорошей идеей - Python for циклов итерации напрямую по итерам, нет необходимости подсчитывать. Если вам нужен индекс (как во втором случае, чтобы проверить, не является ли это первым значением), мы можем использовать enumerate(), чтобы получить это.

Как только у нас есть итерабельность длин, тривиально получить максимальную длину, используя встроенный 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 - это не является жизненно важным, но это помогает сделать код в соответствии с большинством примеров вы найдете и делает его легче распознать вещи с первого взгляда. В основном это означает, что я переименовал переменные.

+0

Я устанавливаю prevX и prevY в 0 в верхнюю часть. – Jayden

+0

@sayna Действительно, я не очень хорошо это сказал - я имею в виду, что они всегда «0», которые, как я предполагал, не были предназначены, поскольку имена подразумевали, что они должны были быть предыдущим пунктом (что объясняет их участие в вычисление длины - от точки к точке), если это не намерение, вам нужно будет объяснить, что вы ищете. –

+0

у вас получилось. Новое для программирования, так что создание одного блока за раз! – Jayden

1

Составьте список длин, а затем получить максимум:

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

maxLength = max(lengths) 
print maxLength 
2

Я изменил код немного просто удалить точку, где вы застряли. Но этот способ написания программы - очень неясно. Я настоятельно рекомендую улучшить функциональные решения других людей здесь, вместо того, чтобы улучшать код стиля C-like.

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) 
+1

'[lens.extend (l) для l в getLengths()]' - использование понимания списка для побочных эффектов - очень плохая практика - либо используйте обычный цикл 'for', либо еще лучше, используйте' itertools.chain. from_iterable() ', чтобы сгладить здесь. –

+1

Ты совершенно прав. Я не был уверен, что 'lens = [i для l в getLengths() для i в l]' ясен для начинающих и реализует быстрый и грязный подход. Это все равно имеет побочные эффекты в getLentgh(), поэтому я оставил бы свой ответ так, как есть. – ipoteka

+1

Я бы не рекомендовал этот подход для выравнивания. 'Itertools.chain.from_iterable (getLengths()) '- лучший способ сгладить ваш повторяющийся один уровень. Это будет быстрее, чем любой метод, основанный на читах pure-python. В том же ключе использование 'list (getLengthsForElement()) будет лучше, чем понимание списка no-op, если вы считаете, что вам нужен список. –

Смежные вопросы