#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. Большое спасибо! Что касается крайних случаев, я уже обрабатываю их в своей программе.