Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2014 14:50:40

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

например:
есть отсортированный список целых чисел:

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)

подскажите более оптимальный (правильный) вариант

Офлайн

#2 Июль 1, 2014 16:20:29

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

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)



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Июль 1, 2014 16:23:40

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

если не хотите создавать еще одну переменную, то можно так

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)



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Июль 1, 2014 16:43:39

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

может выглядит и не так красиво как у вас, но работает раза в 3 быстрее! может есть и более красивые методы, но все они сводятся к этому.



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Июль 1, 2014 17:15:11

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

terabayt
может выглядит и не так красиво как у вас, но работает раза в 3 быстрее
да спасибо действительно быстрее - чевото я перемудрил
думал если список например содержит 2000000 чисел а заданное число - 1999999,
то как то не рационально перебирать весь список,
но у меня получилось ещё менее рационально

Офлайн

#6 Июль 1, 2014 17:21:03

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

оу, если у вас такой большой список, то можно использовать какието специальные алгоритмы. если вы думаете работать с таими большимим списками, напишите мне на почту, я оптимизирую алгоритм, будет еще быстрее работать.



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Июль 1, 2014 17:23:41

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

Да, да
Simple is better than complex.
у меня эта надпись всегда перед глазами



————————————————
-*- Simple is better than complex -*-

Офлайн

#8 Июль 1, 2014 17:27:42

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

Вот если элементов больше 2000000 то НУЖНОиспользовать более быстрый поиск, и тогда поиск можно сократить в 10 раз, как минимум!



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Июль 1, 2014 18:45:15

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

terabayt
оу, если у вас такой большой список
нет реальный список - 500 - 800 элементов
в образовательных целях интересовался

Отредактировано vrabey (Июль 1, 2014 18:46:14)

Офлайн

#10 Июль 1, 2014 20:10:31

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

найти ближайшее число, меньше заданного, в списке

вот ещё нашёл модуль 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)
ещё немного быстрее
и короче

Отредактировано vrabey (Июль 1, 2014 20:11:34)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version