Найти - Пользователи
Полная версия: найти ближайшее число, меньше заданного, в списке
Начало » Центр помощи » найти ближайшее число, меньше заданного, в списке
1 2
vrabey
например:
есть отсортированный список целых чисел:
sp = [0, 5, 19, 33, 56, 71, 75]
и есть случайное число
59
функция должна вернуть
56

написал так:
random_list = [0, 5, 19, 33, 56, 71, 75]
def number_near(n):
    if n in random_list:
        return n
    random_list.append(n)
    random_list.sort()
    return random_list.pop(random_list.index(n) - 1)
print number_near(59)

подскажите более оптимальный (правильный) вариант
terabayt
a = [0, 5, 19, 33, 56, 71, 75]
def f(n):
	if n<a[0]:
		return "n меньше всех"
	for i in a:
		if n < i:
			return x
		x = i
	else:
		return "n больше всех"
print f(59)
terabayt
если не хотите создавать еще одну переменную, то можно так
a = [0, 5, 19, 33, 56, 71, 75]
def f(n):
	if n<a[0]:
		return "n меньше всех"
	for i, j in enumerate(a):
		if n < j:
			return a[i-1]
	else:
		return "n больше всех"
print f(59)
terabayt
может выглядит и не так красиво как у вас, но работает раза в 3 быстрее! может есть и более красивые методы, но все они сводятся к этому.
vrabey
terabayt
может выглядит и не так красиво как у вас, но работает раза в 3 быстрее
да спасибо действительно быстрее - чевото я перемудрил
думал если список например содержит 2000000 чисел а заданное число - 1999999,
то как то не рационально перебирать весь список,
но у меня получилось ещё менее рационально

terabayt
оу, если у вас такой большой список, то можно использовать какието специальные алгоритмы. если вы думаете работать с таими большимим списками, напишите мне на почту, я оптимизирую алгоритм, будет еще быстрее работать.
terabayt
Да, да
Simple is better than complex.
у меня эта надпись всегда перед глазами
terabayt
Вот если элементов больше 2000000 то НУЖНОиспользовать более быстрый поиск, и тогда поиск можно сократить в 10 раз, как минимум!
vrabey
terabayt
оу, если у вас такой большой список
нет реальный список - 500 - 800 элементов
в образовательных целях интересовался
vrabey
вот ещё нашёл модуль bisect
from bisect import bisect
sp = [0, 5, 19, 33, 56, 71, 75]
def number_near(num):
    return sp[bisect(sp, num) - 1]
print number_near(59)
ещё немного быстрее
и короче
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