Найти - Пользователи
Полная версия: Поиск близких значений от заданного
Начало » Python для новичков » Поиск близких значений от заданного
1 2
denveren0k
Доброго времени суток уважаемые форумчане.
Очень нужна ваша помощь с алгоритмом поиска в словаре.

К примеру есть словарь
GB = {387:387000.00, 385:384638.48, 384:383209.20, 381:380876.15, 378:378479.63}
При вводе в форму значения например 384500 алгоритм должен найти два соседних значения в данном примере это 384638.48 и 384:383209.20. Известно что в словаре все числа идут от большего к меньшему по порядку. Пробовал через цикл for но так ничего путнего не смог сделать, может есть модуль для работы с поиском в данном случае?
bismigalis
Если встречаются слова “порядок” и “цикл for” то тебе не нужен словарь. Используй список.
Shaman
denveren0k, а что должен выдать алгоритм в случае присутствия искомого значения в словаре?
doza_and
Shaman
Известно что в словаре все числа идут от большего к меньшему по порядку
Откуда известно? Это не так.
denveren0k
После того как два близких значения будут найдены с их ключами и с самими значениями будут вестись расчеты согласно формулам.
bismigalis
Если встречаются слова “порядок” и “цикл for” то тебе не нужен словарь. Используй список.
С радостью бы использовал. если бы и ключи не были нужны , 384:383209.20 с ключем 384 и значением 383209.20 будут выполняться определенные манипуляции.
Пробовал через Json сделать что бы удобнее было искать но не осилил
Саму программу уже написал, форму и тому подобное, а вот с алгоритмом ппц.
denveren0k

doza_and
Почему не так, я привел вырезку из словаря, далее по порядку идет убывание.
bismigalis
список больщой вообще?
s0rg
from operator import itemgetter
GB = {
    387: 387000.00,
    385: 384638.48,
    384: 383209.20,
    381: 380876.15,
    378: 378479.63
}
def find_approx(haystack, needle):
    mins, maxs = [], []
    for k, v in haystack.iteritems():
        (mins if v < needle else maxs).append((k, v))
    min_max = min(maxs, key=itemgetter(1))
    max_min = max(mins, key=itemgetter(1))
    return (max_min, min_max)
left, right = find_approx(GB, 384500)
print 'Neighbours: {} and {}'.format(left, right)
Shaman
Если в неизменном и достаточно объёмном словаре поиск будет вестись несколько раз, имеет смысл создать его обёрнутую копию, в которой ключи и значения обменяются ролями. Далее в нём производить поиск половинным делением.
denveren0k
Всем спасибо за помощь код s0rg очень помог.
bismigalis
список больщой вообще?
Да довольно таки большой, больше 200-ста значений.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB