2013-02-12 7 views
-1

Поэтому у меня есть список списковнайти [Макс, мин] значение в списке списков питона

alist = [[distance1,delta-angle1,object1],[distance2,delta-angle2,object2], [distance3,delta-angle3,object3],...] 

Я хочу, чтобы максимизировать для «расстояния» и свести к минимуму для «дельта-угол», которые являются первые два элемента из каждого list в alist и верните этот конкретный список.

предостережение: distance будет поплавком и delta-angle будет в градусах (-180: 180)

Цель состоит в том, чтобы выбрать самую длинную дистанцию ​​с «straightest» углом, но не только самым длинным или " прямолинейный "(иначе известный как минимизирующее изменение угла)

EDIT: Я не могу загрузить изображение, так что вот ссылка.

http://imgur.com/a/b6KWM#YqGxdlu

Я хотел бы избежать «идти туда, где я был», как и в этом особом случае. Как показано на втором изображении

ИЗОБРАЖЕНИЯ 2

Третье изображение является идеальным - и так как я до сих пор не придумал лучшего способа заявить следующим образом: свести к минимуму изменение угла от текущего подшипника (который дельта-угол, что хранится в alist уже) и максимизировать distance или длину доступных сегментов линии (обозначаемый здесь концами на границе в следующей картине)

IMAGE 3 http://imgur.com/a/b6KWM#YqGxdlu

+5

Ваше определение «самое длинное расстояние с прямым углом» довольно неопределенно - можете ли вы определить функцию полезности? если у вас есть пара элементов, как вы можете решить, какой из них лучше? –

+2

Вы не можете получить ответ, пока не получите конкретную формулу для выбора того, какой из них лучше. После этого вы можете просто отсортировать его, указав ключ. (подробнее читайте: http://wiki.python.org/moin/HowTo/Sorting/) – placeybordeaux

+0

Кроме того, почему вы предполагаете, что вам нужно «положить [угол] по шкале от [0 ... 360]» до минимизировать его? Вы действительно хотите, чтобы 89 ° считалось более минимальным, чем -45 °? Если нет, оставьте его как [-180, 180] и просто скройте 'abs (angle)' вместо 'angle'. – abarnert

ответ

0
alist = [[0,0,'b'],[-30,50,'a'], 
     [45,63,'d'],[100,170,'d'], 
     [-2,15,'p']] 

def mM(L): 
    x,y,_ = zip(*L) 
    return (min(x),max(y)) 

print mM(alist) 

результат

(-30, 170) 
+0

Я не думаю, что вопросник хочет раздельные максимумы и минимумы, но это единственное комбинированное значение max/min. – Blckknght

+0

Это правильно - я хочу (максимизировать, свести к минимуму). –

+0

@ user1124683 У вас есть неочевидная неочевидная манера выражения. Это проблема – eyquem

1

Даже после уточнения, ваше правило до сих пор неоднозначно. Вам нужно выяснить, какое правило вы хотите реализовать, прежде чем вы сможете закодировать это правило.

Если правило достаточно простое, вы должны иметь возможность написать функцию, которая возвращает более высокое значение, тем лучше совпадение. В этом случае вы можете просто передать эту функцию как key в max (или вы можете sorted, или heapq.nlargest и т. Д., В зависимости от вашего фактического использования).

Например, если правило является просто «объектом с наибольшим компонентом Х, то лучше всего», как говорит Блеккнут, это всего лишь distance*cos(angle). Кроме того, конечно, что вы, вероятно, хотите самый большой положительный или отрицательный компонент X, так что это фактически abs(that). Итак:

def best(alist): 
    return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1])) 

(Поскольку каждый элемент list является list из distance, angle, object, я назвал каждого из этих элементов dao, так dao[0] расстояние и т.д.)

Что делать, если вы можете» t выяснить, как превратить правило в одну ключевую функцию?

Ну, если вы можете написать функцию сравнения, которая сравнивает два dao тройни и возвращает больше одного, вы можете использовать functools.cmp_to_key, чтобы превратить это в key функции.Но на самом деле, это не так часто, что вы можете написать функцию cmp, но не можете написать функцию key.

Если вам нужно что-то более сложное, вы всегда можете предварительно отфильтровать список, или декорировать-сортировки-undecorate и т.д.

Например, в комментарии, вы говорите:

в большая часть полезности будет поступать из длинных линий, которые попадают в диапазон от -90: 0: 90, а все остальное мало полезно, независимо от того, сколько времени осталось.

Это неоднозначный, но один способ, которым мы могли бы интерпретировать это:

  • Если есть какие-либо объекты с углом в диапазоне [-90, 90], выбрать самый длинный из этих объектов ,
  • В противном случае выберите объект с наименьшим углом.

Я мог написать, что в качестве ключевой функции, но давайте представим, что я не знаю, как и хотел, чтобы все четко. Тривиально написать ключевую функцию для longest - это просто ключ dao[0]. И также тривиально написать ключевую функцию для smallest angle - это просто abs(dao[1]). Итак:

def best(alist): 
    acutes = [[d, a, o] for [d, a, o] in alist if abs(a) <= 90] 
    if acutes: 
     return max(acutes, key=lambda dao: dao[0]) 
    else: 
     return min(alist, key=lambda dao: abs(dao[1])) 
Смежные вопросы