Я создаю сайт знакомств в Django/Python. У меня есть даты рождения и вам нужно показать, что знак Зодиака человека основан на их дне рождения.
Кто-нибудь сделал это раньше? Каким будет наиболее эффективный способ выполнения этого?
Я создаю сайт знакомств в Django/Python. У меня есть даты рождения и вам нужно показать, что знак Зодиака человека основан на их дне рождения.
Кто-нибудь сделал это раньше? Каким будет наиболее эффективный способ выполнения этого?
Я сделал это раньше. Простейшим решением, с которым я столкнулся, был массив следующих ключей/значений:
120:Cap, 218:Aqu, 320:Pis, 420:Ari, 521:Tau,
621:Gem, 722:Can, 823:Leo, 923:Vir, 1023:Lib
1122:Sco, 1222:Sag, 1231: Cap
Затем вы записываете дату рождения в формате mdd
, то есть номер месяца (начиная с 1 для января) и двухзначный номер дня (01-31). Итерации через массив, и если дата меньше или равна элементу в массиве, у вас есть знак звезды.
ИЗМЕНИТЬ Мне это нужно, поэтому здесь это понятие работает как функция работы
zodiacs = [(120, 'Cap'), (218, 'Aqu'), (320, 'Pis'), (420, 'Ari'), (521, 'Tau'),
(621, 'Gem'), (722, 'Can'), (823, 'Leo'), (923, 'Vir'), (1023, 'Lib'),
(1122, 'Sco'), (1222, 'Sag'), (1231, 'Cap')]
def get_zodiac_of_date(date):
date_number = int("".join((str(date.date().month), '%02d' % date.date().day)))
for z in zodiacs:
if date_number <= z[0]:
return z[1]
Вы можете дать им дополнительную информацию о позиции планет и звезд.
import ephem
>>> u = ephem.Uranus()
>>> u.compute('1871/3/13')
>>> print u.ra, u.dec, u.mag
7:38:06.27 22:04:47.4 5.46
>>> print ephem.constellation(u)
('Gem', 'Gemini')
Использование bisect более эффективно, чем итерация, пока вы не найдете совпадение, но таблица поиска для каждого дня года быстрее и действительно не такая большая.
from bisect import bisect
signs = [(1,20,"Cap"), (2,18,"Aqu"), (3,20,"Pis"), (4,20,"Ari"),
(5,21,"Tau"), (6,21,"Gem"), (7,22,"Can"), (8,23,"Leo"),
(9,23,"Vir"), (10,23,"Lib"), (11,22,"Sco"), (12,22,"Sag"),
(12,31,"Cap")]
def zodiac_sign(m,d):
return signs[bisect(signs,(m,d))][2]
assert zodiac_sign(3,9) == "Pis"
assert zodiac_sign(6,30) == "Can"
var ZZ=[1231,1222,1122,1023,923,823,722,621,521,420,321,220,121];
var ZN=['Capricorn','Sagittarius','Scorpio','Libra','Virgo','Leo','Cancer', 'Gemini','Taurus','Aries','Pisces','Aquarius','Capricorn'];
var d8=new Date();
var m=d8.getMonth()+1;
var d=d8.getDate();
//m=1;d=1
var mdd=parseInt(''+m+(d<9?'0'+d:d));
var i=0;while(ZZ[i]>mdd && i<ZZ.length){i++}--i;
var RV='Born '+m+'/'+d+' - Star Sign: '+ZN[i];RV
Heres my algo без использования цикла (логика JS: использование объекта js)
var zods = {
0:{limit:21,vals:["aqu","cap"]},
1:{limit:20,vals:["pis","aqu"]},
2:{limit:21,vals:["ari","pis"]},
3:{limit:21,vals:["tau","ari"]},
4:{limit:21,vals:["gem","tau"]},
5:{limit:21,vals:["can","gem"]},
6:{limit:22,vals:["leo","can"]},
7:{limit:22,vals:["vir","leo"]},
8:{limit:22,vals:["lib","vir"]},
9:{limit:22,vals:["sco","lib"]},
10:{limit:23,vals:["sag","sco"]},
11:{limit:22,vals:["cap","sag"]}
};
var dt = new Date();
var zodObj = zods[dt.getMonth()];
return dt.getDate()>=zodObj.limit?zodObj.vals[0]:zodObj.vals[1];