Python находит ближайшее значение с плавающей точкой в списке кортежа

#python #python-3.x #list #tuples

Вопрос:

У меня есть значение total_weight = 212.0 , и у меня есть раздел моей программы, который пытается найти точное значение, но у меня нет точного веса в моем списке.

Поэтому я хочу получить ближайшее значение. В этом примере это было бы [(200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0))]

List = [ (180.0, (2.5, 5.0, 10.0, 15.0, 35.0)), (200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0)), (240.0, (2.5, 5.0, 10.0, 35.0, 45.0)), (210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), (230.0, (2.5, 5.0, 15.0, 25.0, 45.0)), (250.0, (2.5, 5.0, 15.0, 35.0, 45.0)), (270.0, (2.5, 5.0, 25.0, 35.0, 45.0)), (220.0, (2.5, 10.0, 15.0, 25.0, 35.0)), (240.0, (2.5, 10.0, 15.0, 25.0, 45.0)), (260.0, (2.5, 10.0, 15.0, 35.0, 45.0)), (280.0, (2.5, 10.0, 25.0, 35.0, 45.0)), (290.0, (2.5, 15.0, 25.0, 35.0, 45.0)), (225.0, (5.0, 10.0, 15.0, 25.0, 35.0)), (245.0, (5.0, 10.0, 15.0, 25.0, 45.0)), (265.0, (5.0, 10.0, 15.0, 35.0, 45.0)))]

Я пробовал использовать min (), но мне не удалось заставить его работать.

Комментарии:

1. Ближайшее значение или ближайшие значения ? Похоже, вам нужен список кортежей, первый элемент которых находится ближе total_weight всего .

2. Ближайшие значения. Мне нужны верхние и нижние ближайшие значения. Извините, что не было ясно.

3. Пожалуйста, поясните свой пример. Является ли «это» примером ввода или вывода? С какими ценностями вы сравниваете total_weight ?

Ответ №1:

Чтобы найти ближайшее значение, используйте min key функцию, которая определяет расстояние до цели:

 >>> weights = [
    (180.0, (2.5, 5.0, 10.0, 15.0, 35.0)), 
    (200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), 
    (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), 
    (220.0, (2.5, 5.0, 10.0, 25.0, 45.0)), 
    (240.0, (2.5, 5.0, 10.0, 35.0, 45.0)), 
    (210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), 
    (230.0, (2.5, 5.0, 15.0, 25.0, 45.0)), 
    (250.0, (2.5, 5.0, 15.0, 35.0, 45.0)), 
    (270.0, (2.5, 5.0, 25.0, 35.0, 45.0)), 
    (220.0, (2.5, 10.0, 15.0, 25.0, 35.0)), 
    (240.0, (2.5, 10.0, 15.0, 25.0, 45.0)), 
    (260.0, (2.5, 10.0, 15.0, 35.0, 45.0)), 
    (280.0, (2.5, 10.0, 25.0, 35.0, 45.0)), 
    (290.0, (2.5, 15.0, 25.0, 35.0, 45.0)), 
    (225.0, (5.0, 10.0, 15.0, 25.0, 35.0)), 
    (245.0, (5.0, 10.0, 15.0, 25.0, 45.0)), 
    (265.0, (5.0, 10.0, 15.0, 35.0, 45.0)),
]
>>> total_weight = 212.0
>>> min(weights, key=lambda w: abs(w[0] - total_weight))
(210.0, (2.5, 5.0, 15.0, 25.0, 35.0))
 

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

 >>> weights.sort()
>>> higher = next(i for i in range(len(weights)) if weights[i][0] > total_weight)
>>> weights[higher-1:higher 1]
[(210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0))]
 

(Обработка крайних случаев добавляет больше сложности-что, если есть точное совпадение? Что делать, если цель либо выше, либо ниже всех значений? И т.д.)

Комментарии:

1. Большое спасибо! Что касается крайних случаев, я уже обрабатываю их в своей программе.