最近经常看到关于星座的推送,我其实不信这个,但是由于推送得太多了,总有几篇会让我好奇地点进去看看。然后想想其实用Python写一篇星座相关的文章也不错。

正好,Python计算一个人的星座特别简单,因为每个星座的日期是固定的。我们只需要四行代码就能计算:

def cal_constellation(month, day):
    constellation = (u'摩羯座',u'水瓶座',u'双鱼座',u'白羊座',u'金牛座',u'双子座',u'巨蟹座',u'狮子座',u'处女座',u'天秤座',u'天蝎座',u'射手座')
    start_day = ((1,20),(2,19),(3,21),(4,21),(5,21),(6,22),(7,23),(8,23),(9,23),(10,23),(11,23),(12,23))
    return constellation[len(list(filter(lambda y:y<=(month,day), start_day)))%12]

把出生的月份和日期传入这个函数,就能得到对应的星座了。当然,这只是非常简单的第一步,接下来让我们计算2012全球富豪榜前一百名中,哪个星座的人最多,嘻嘻,期待吗?

1.获得数据

豆瓣上有个帖子帮我们列出了相应的数据,不过是以文本的形式:https://www.douban.com/group/topic/28671832/

幸好有统一的格式,我们能用正则表达式把出生日期提取出来:

(\d+) ?月 ?(\d+) ?日

在Vscode中还能直接用模式替换,变成我们想要的元组形式:

最后发现有出生月日的只有88条,没关系,够我们用了。

2.放入代码计算

将前面获得的所有日期放入数组中,然后调用我们一开始说的星座计算函数即可,当然,需要用一个字典来计算每次星座的出现:

birth_day = [
    (1, 28), (10, 28), (8, 30), (3, 5), (3, 28), (8, 17), (11, 3), (10, 4), (7, 29), (2, 20), (11, 1),
    (5, 3), (8, 4), (10, 21), (7, 7), (10, 7), (10, 28), (4, 19), (2, 14), (6, 15), (8, 12), (4, 26),
    (8, 21), (3, 26), (1, 12), (4, 2), (9, 9), (3, 7), (2, 20), (2, 9), (3, 28), (11, 5), (4, 16), (1, 14),
    (4, 12), (6, 12), (9, 1), (5, 14), (9, 21), (8, 26), (2, 23), (5, 7), (7, 24), (3, 24), (9, 26), (1, 3),
    (2, 24), (1, 21), (7, 8), (2, 16), (8, 16), (10, 10), (9, 1), (4, 21), (5, 3), (4, 28), (8, 21), (12, 1),
    (12, 14), (10, 6), (1, 27), (4, 14), (6, 4), (10, 24), (5, 11), (8, 26), (1, 1), (6, 14), (8, 11), (5, 22),
    (5, 10), (4, 10), (5, 9), (12, 22), (12, 11), (3, 20), (3, 8), (9, 22), (12, 19), (11, 17), (9, 15), (3, 25),
    (2, 7), (4, 4), (4, 1), (6, 2), (2, 13), (11, 8)
]
def cal_constellation(month, day):
    constellation = (u'摩羯座',u'水瓶座',u'双鱼座',u'白羊座',u'金牛座',u'双子座',u'巨蟹座',u'狮子座',u'处女座',u'天秤座',u'天蝎座',u'射手座')
    start_day = ((1,20), (2,19), (3,21), (4,21), (5,21), (6,22), (7,23), (8,23), (9,23), (10,23), (11,23), (12,23))
    return constellation[len(list(filter(lambda y:y<=(month,day), start_day)))%12]

result = {}
for birth in birth_day:
    constel = cal_constellation(birth[0], birth[1])
    if constel not in result:
        result[constel] = 0
    else:
        result[constel] += 1
print(result)

结果如下:

{‘水瓶座’: 7, ‘天蝎座’: 7, ‘处女座’: 8, ‘双鱼座’: 7, ‘白羊座’: 12, ‘狮子座’: 8, ‘天秤座’: 5, ‘金牛座’: 9, ‘巨蟹座’: 1, ‘双子座’: 5, ‘摩羯座’: 3, ‘射手座’: 4}

排个序吧:

print(sorted(result.items(), key=lambda item: item[1]))

结果:

[(‘巨蟹座’, 1), (‘摩羯座’, 3), (‘射手座’, 4), (‘天秤座’, 5), (‘双子座’, 5), (‘水瓶座’, 7), (‘天蝎座’, 7), (‘双鱼座’, 7), (‘处女座’, 8), (‘狮子座’, 8), (‘金牛座’, 9), (‘白羊座’, 12)]

白羊座惊为天人达到了12位。12/88 = 14%啊,这个比例相当牛皮了。然而我的巨蟹座只有1位,枯了,难道我没有成为富豪的天赋??

不过,大家也不要伤心。我们只取了88名富豪的数据还不够多,像这样的数据分析大概要8888名富豪的出生日期才能得到一个比较靠谱的结果。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python实用宝典
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。