У меня есть следующий список 2d Python mylist координат ...

[[294.0, 351.0], [486.0, 255.5]]

Я пытаюсь определить, какая из этих точек ближе всего к центру области 500x500, как это ...

def sqr_dist(a, b):
    # return square of distance between points a and b #
    return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2

central = min( mylist, key=lambda r: sqr_dist( (mylist[0], mylist[1]), (500, 500) ) )

Но я получаю ошибку ...

TypeError: unsupported operand type(s) for -: 'list' and 'int'

Я предполагаю, что это говорит мне, что я не могу использовать min на list

Если это так, то какова моя альтернатива?

1
fightstarr20 6 Июл 2019 в 12:39

3 ответа

Лучший ответ
sqr_dist( (mylist[0], mylist[1]), (500, 500) )
b=(500, 500)
a[0]=[294.0, 351.0]
b[0]=500

{{Х0}} как показывает ваша ошибка - символ -: 'list' and 'int'

Правильный способ сделать это

central = min( mylist, key=lambda r: sqr_dist( r, (500, 500) ) )
1
AnkushRasgon 6 Июл 2019 в 10:03

Проблема из-за a [0] -b [0]. a [0] - список, b [0] - целое число. Итак, что вы должны сделать, это:

mylist = [[294.0, 351.0], [486.0, 255.5]]

def sqr_dist(a, b):
    # return square of distance between points a and b #
    return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2

central = min(mylist, key=lambda r: sqr_dist( r, (500.0, 500.0) ) )

Разница в том, что теперь я передаю r (список) в sqr_dist в лямбде. Проблема с лямбда-функцией.

1
Kevin Winata 6 Июл 2019 в 09:52

Вы просто неправильно использовали лямбду.

Ваша ошибка означает, что вы пытаетесь сделать - вычитание между list и int. Это потому, что вы передавали обе функции sqr_dist. Правильный способ сделать это:

central = min( mylist, key=lambda r: sqr_dist( r, (500, 500) ) )
1
Akaisteph7 6 Июл 2019 в 09:52