Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вычислить ближайшие числа в массиве python

Cat Blue Профи (987), закрыт 3 года назад
Есть два массива с координатами, график.
x = [166.3, 188.9, 195.2, 209.1, 219.2, 225, 236.1, 242.8, 247.6, 252.9, 260.6, 265.9, 271.6, 275.5]
y = [0.11, 0.22, 0.33, 0.44, 0.55, 0.65, 0.76, 0.87, 0.98, 1.09, 1.2, 1.31, 1.42, 1.53]

Как можно вычислить ближайшие числа в массиве в+ и - от заданной переменной.
Например я указываю 200 по иксу,
а мне выдаются:
x = 195.2, 209.1
и соответствующие им ячейки по y
y = 0.33, 0.44

Если можно, пожалуйста подробнее, я начинающий.
Лучший ответ
Хлебушек Оракул (76326) 3 года назад
Можн примерно так:

find_x = 200 // или float(input())
i = 0
while i < len(x):
    if x[i] >= find_x:
        break
    i +=1
print(f"x = {x[i - 1]}, {x[i]}")
print(f"y = {y[i - 1]}, {y[i]}")

Но некоторые моменты решай сам:
- Что если ввести число меньше, чем есть в массиве или больше?
- Поиск можно немного оптимизировать бинарным поиском (отсечь часть, меньше или больше медианы, ведь массив судя по всему отсортирован)
- А если будет число равное 200? Какой диапазон брать? после 200 или до 200?
Cat BlueПрофи (987) 3 года назад
Защита не требуется. Буду вводить только корректные данные.
Хлебушек Оракул (76326) Cat Blue, ну это сам смотри, пример я накидал
Тык ПыкМыслитель (7328) 3 года назад
А первая строка зачем? Извиняюсь.
Ну, и предлагать f строки всем - это не очень.
Хлебушек Оракул (76326) а что с первой строкой? И что подразумевается под "не очень"?)
Тык ПыкМыслитель (7328) 3 года назад
Я про версию Питона, которую можно установить, конечно-же.
Хлебушек Оракул (76326) Тык Пык, я понял
Тык ПыкМыслитель (7328) 3 года назад
А Питон не могу установить. требует КБ МС, КБ сейчас недоступен, доступен только в каком-то кумулятиве. И, ни хрена не помогает даже эта установка. причём я уже отвязался от домена, обнулил пасс Админа, стал локальным админом..
Хлебушек Оракул (76326) Тык Пык, Я еще не заядлый программист и половину слов не понял)) Но могу согласиться - из за кибербезопасности всегда дроч возникает с использованием программ
Тык ПыкМыслитель (7328) 3 года назад
Ну, проблема в kb MS - обновлениях безопасности. К программированию это мало относиться, но влияет сильно.
Остальные ответы
Тык Пык Мыслитель (7328) 3 года назад
Самый тупой вариант - сделать сначала 2 переменных. И перебирать, меняя обе переменные.
Можно сделать сортировку списком. С индексами можно разобраться.
Не очень понятно условие "соответствующие им ячейки по y".
Т. е. списки заведомо одинаковы по длине? И ищем по индексу найденной величины из списка Х индексы (x-1) и (x+1)? Bkb rfr&
Cat BlueПрофи (987) 3 года назад
"Т. е. списки заведомо одинаковы по длине?"
Да, как в примере.
Тык Пык Мыслитель (7328) Cat Blue, а список упорядоченный подаётся на вход?
Тык ПыкМыслитель (7328) 3 года назад
Я имею в иду не отступления. Я имею в виду, что список уже упорядочен от мин элемента до мах по возрастанию?
Если так, то бери в начале переменную "к",например, присваивай ей твою величину (200 в примере).
Потом циклом условия перебирай список на то, что очередной элемент списка >к.
Как условие выполнится, выводи из обоих списков величины с индексами "к" и "к-1".
Это самое тупое и простое решение.. Но, я и не программист)))
Тык Пык Мыслитель (7328) Тык Пык, Это к выводу. Последние 2 строки))
Aleks Nots Просветленный (24251) 3 года назад
x = [166.3, 188.9, 195.2, 209.1, 219.2, 225, 236.1, 242.8, 247.6, 252.9, 260.6, 265.9, 271.6, 275.5]
y = [0.11, 0.22, 0.33, 0.44, 0.55, 0.65, 0.76, 0.87, 0.98, 1.09, 1.2, 1.31, 1.42, 1.53]

z = float(input())
for i,a in enumerate(x):
~~~~if a > z:
~~~~~~~~break
if i > 0 and i < len(x)-1:
~~~~print(x[i-1], x[i])
~~~~print(y[i-1], y[i])
else:
~~~~print(x[i])
~~~~print(y[i])
Cat BlueПрофи (987) 3 года назад
Тоже благодарю, работает.
Как правильно понимать for i,a in enumerate(x):?
i - индекс, a - итерации?
Aleks Nots Просветленный (24251) Cat Blue, "Как правильно понимать for i,a in enumerate(x):?" y = [0.11, 0.22, 0.33, 0.44, 0.55] for a in enumerate(y): print(a) ================== (0, 0.11) (1, 0.22) (2, 0.33) (3, 0.44) (4, 0.55) >>> То есть enumerate(последовательность1) выдает последовательность2 кортежей, состоящих из индекса и элемента последовательности1 по этому индексу. Обычно эти кортежи сразу присваиваются кортежу из индекса и элемента, например так: for i,a in enumerate(x):
Cat BlueПрофи (987) 3 года назад
Нет, получается а - переменная, а i - итерации.
Похожие вопросы