возвращая самый большой или самый маленький результат из цикла for в python - PullRequest
0 голосов
/ 14 апреля 2011

Предположим, сундук представляет собой список координат, которые представляют собой два списка элементов.

Например сундук = [[2,4], [4,5], [1,3]]

С помощью функции ниже, я хочу расстояние между точкой (x, y) и каждой из точек сундука. Таким образом, функция возвращает эти три расстояния, верно? Но мой вопрос в том, как мне вернуть только самый маленький (или самый большой) результат из этих трех значений? Есть ли способ сделать это без создания нового списка расстояний?

def makeMove (доска, сундук, х, у):

for cx, cy in chests:
    distance = sqrt(abs((x-cx)**2) + abs((y-cy)**2)))
    return distance

Ответы [ 3 ]

7 голосов
/ 14 апреля 2011

Вы можете использовать max() или min() плюс выражение генератора ...

return max(
    sqrt( abs(x - cx) + abs(y - cy) )
    for cx, cy in chests)

Также обратите внимание, что в качестве оптимизации вы можете предпочесть сделать это вместо этого (поскольку, если sqrt(x) > sqrt(y), то x > y), чтобы уменьшить количество вызовов sqrt:

return sqrt(max(
    abs(x - cx) + abs(y - cy)
    for cx, cy in chests))

(Кроме того, вы уверены, что не хотите возводить в квадрат расстояния вместо abs() их вычисления? Обычная формула расстояния равна sqrt((x-x')^2 + (y-y')^2) ...)

1 голос
/ 14 апреля 2011

Как таковая, ваша функция возвращает только первое расстояние.Когда во время первой итерации цикла встречается оператор return, функция возвращается, и все.

Более того, ваша формула для расстояния, вероятно, неверна, поскольку аргумент sqrt() может быть отрицательным.В приведенном ниже коде я предполагаю, что вместо этого вам нужно евклидово расстояние.

Хотя вы можете получить минимум и максимум, используя выражения генератора, для этого потребуется вычислить все расстояния дважды.Основываясь на цикле, который вы написали, вы можете сделать

def distance_squared(p0, p1):
    return sum((x0 - x1) ** 2 for x0, x1 in zip(p0, p1))

def makeMove(board, chest, x, y):
    chest_iter = iter(chest)
    min_dist = distance_squared(next(chest_iter), (x, y))
    max_dist = min_dist
    for c in chest_iter:
        dist2 = distance_squared(c, (x, y))
        min_dist = min(min_dist, dist2)
        max_dist = max(max_dist, dist2)
    return sqrt(min_dist), sqrt(max_dist)
0 голосов
/ 14 апреля 2011
max_distance = max([sqrt((abs(x) - abs (cx)) + (abs(y) - abs(cy))) for cx, cy in chests])
min_distance = min([sqrt((abs(x) - abs (cx)) + (abs(y) - abs(cy))) for cx, cy in chests])

По сути, вы превращаете цикл в понимание списка (таким образом, вы фактически создаете новый список) и вызываете max и min, чтобы получить наименьших членов из нового списка расстояний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...