如何在Python中通过生日确定星座/占星星座?

10

我正在使用Django/Python构建一个约会网站。我有生日日期,并需要根据他们的生日显示该人的星座。

有人做过这个吗?完成此操作的最有效方法是什么?

6个回答

15

我以前做过这个。 我最终采用的最简单解决方案是以下键/值数组:

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]

2
+1 - 这看起来是最好的解决方案,而不必安装新模块。 - R Samuel Klatchko
1
你可以使用 date_number = date.date().month * 100 + date.date().day 替代 date_number = int("".join((str(date.date().month), '%02d' % date.date().day))) - Steve K
如果我选择12月31日,结果会出错。该函数返回None。 - Fomalhaut
@Fomalhaut 将 < 改为 <= - bluesmoon
在这种情况下,应将星座列表更改为以下内容,以避免日期比较错误(12月22日返回“射手座”)zodiacs = [(119,“摩羯座”),(217,“水瓶座”),(319,“双鱼座”),(419,“白羊座”),(520,“金牛座”), (620,“双子座”),(721,“巨蟹座”),(822,“狮子座”),(922,“处女座”),(1022,“天秤座”), (1121,“天蝎座”),(1221,“射手座”),(1231,“摩羯座”)] - Hoang HUA
显示剩余6条评论

8
你可以向他们提供更多关于行星和恒星位置的信息。 点击此处 了解更多。
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')

3
在理想的情况下,您可以使用“ephem”库,通过将示例中的“Uranus”替换为“Sun”,来查找星座。然而,似乎星座和星官并不完全匹配。还有一个专门用于占星术的Python库叫做“oroboros”,但可能过于复杂了。 - Aram Dulyan

8

使用二分查找比迭代查找更有效,但每天的查找表仍然更快,而且实际上并不大。

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"

2
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]&gt;mdd && i&lt;ZZ.length){i++}--i;

var RV='Born '+m+'/'+d+' - Star Sign: '+ZN[i];RV

1
def zodiac(day,month):
    signs=[('Capricorn',19),('Aquarius',18),('Pisces',20),('Aries',19),('Taurus',20),('Gemini',20) ,('Cancer',22),('Leo',22) ,('Virgo',22) ,('Libra',22) ,('Scorpio',21),('Sagittarius',21),('Capricorn',)]
    if(day<=signs[month-1][1]):
        return signs[month-1][0]
    else:
        return signs[month][0]

0
这是我的算法,不使用循环(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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接