@dmitriykyc

Поясните что значит в sorted(values, key=lambda x: (abs(x-one), x)) последнее значение x(после запятой)?

Я из новичков))

Есть задача:
Вам даны список значений и значение, относительно которого, надо найти ближайшее.

Например, мы имеем следующий ряд чисел: 4, 7, 10, 11, 12, 17. И нам нужно найти ближайшее значение к цифре 9. Если отсортировать этот ряд по возрастанию, то слева от 9 будет 7, а справа 10. Но 10 - находится ближе, чем 7, значит правильный ответ 10.


Я решил таким образом:

def nearest_value(values, one: int) -> int:
    return sorted(values, key=lambda x: (abs(x-one)))[0]

print(nearest_value([4, 7, 10, 11, 12, 17], 9)) == 10
print(nearest_value([4, 7, 10, 11, 12, 17], 8)) == 7


Но, если ищем в этих значениях:
print(nearest_value([0, -2}, -1)) == -2

моя функция возвращает 0, хотя должна вернуть -2.

Нашел такое решение:

def nearest_value(values, one: int) -> int:
    return sorted(values, key=lambda x: (abs(x-one), x))[0]


Но не понимаю что делает последний "x" который после запятой?
  • Вопрос задан
  • 471 просмотр
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Ваша функция возвращает не один элемент, а все, отсортированные в порядке удаления от заданного.

key=lambda x: (abs(x-one), x)
это функция, по значениям которой сортируются элементы массива.
Значение этой функции - кортеж из двух элементов: первый - это модуль разности, а второй это текущий элемент списка.
Кортежи можно сравнивать на > и <. При этом они сравниваются поэлементно слева направо.
Смысл добавления x в том, что расстояние от -1 до 0 и до -2 одинаковое и сортировка не различала эти два элемента между собой. Когда вы стали сортировать по ключевому кортежу, то при равенстве расстояния порядок определяется значением самого элемента. Выбирается сперва тот, что меньше (в вашем случае -2).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы