Python实现:与其穷举构造字典,不如直接用《百家姓》返回其index


大家好,我是我是皮皮。

一、前言

前几天在Python最强王者交流群【小王】大佬分享了一个Python代码,关于百家姓的,按百家姓排名名字顺序。
image.png

这个方法虽好,但是【德善堂小儿推拿-瑜亮老师】大佬觉得与其穷举构造字典,不如直接用《百家姓》返回其index,在粉丝【mofyl】的请求下,完成了代码编写。

image.png

二、解决过程

下面这个是针对单字姓的,百家姓是从网上直接复制的,返回其index实现的代码如下所示:

import re
a = '''
赵钱孙李,周吴郑王。冯陈褚卫,蒋沈韩杨。朱秦尤许,何吕施张。孔曹严华,金魏陶姜。
戚谢邹喻,柏水窦章。云苏潘葛,奚范彭郎。鲁韦昌马,苗凤花方。俞任袁柳,酆鲍史唐。
费廉岑薛,雷贺倪汤。滕殷罗毕,郝邬安常。乐于时傅,皮卞齐康。伍余元卜,顾孟平黄。
和穆萧尹,姚邵湛汪。祁毛禹狄,米贝明臧。计伏成戴,谈宋茅庞。熊纪舒屈,项祝董梁。
杜阮蓝闵,席季麻强。贾路娄危,江童颜郭。梅盛林刁,钟徐邱骆。高夏蔡田,樊胡凌霍。
虞万支柯,昝管卢莫。经房裘缪,干解应宗。丁宣贲邓,郁单杭洪。包诸左石,崔吉钮龚。
程嵇邢滑,裴陆荣翁。荀羊於惠,甄曲家封。芮羿储靳,汲邴糜松。井段富巫,乌焦巴弓。
牧隗山谷,车侯宓蓬。全郗班仰,秋仲伊宫。宁仇栾暴,甘钭厉戎。祖武符刘,景詹束龙。
叶幸司韶,郜黎蓟薄。印宿白怀,蒲邰从鄂。索咸籍赖,卓蔺屠蒙。池乔阴鬱,胥能苍双。
闻莘党翟,谭贡劳逄。姬申扶堵,冉宰郦雍。郤璩桑桂,濮牛寿通。边扈燕冀,郏浦尚农。
温别庄晏,柴瞿阎充。慕连茹习,宦艾鱼容。向古易慎,戈廖庾终。暨居衡步,都耿满弘。
匡国文寇,广禄阙东。欧殳沃利,蔚越夔隆。师巩厍聂,晁勾敖融。冷訾辛阚,那简饶空。
曾毋沙乜,养鞠须丰。巢关蒯相,查后荆红。游竺权逯,盖益桓公。
'''
b = re.sub(r'[,。\n]', '', a)
c = {k: v for k, v in enumerate(b)}
print(c)

输出结果如下图所示:

image.png

单姓的容易实现,那么复姓的会不会出不来呢?

image.png

复姓实现的代码如下所示:

fx = '''
万俟,司马,上官,欧阳,夏侯,诸葛,闻人,东方,
赫连,皇甫,尉迟,公羊,澹台,公冶,宗政,濮阳,
淳于,单于,太叔,申屠,公孙,仲孙,轩辕,令狐,
钟离,宇文,长孙,慕容,鲜于,闾丘,司徒,司空,
丌官,司寇,仉督,子车,颛孙,端木,巫马,公西,
漆雕,乐正,壤驷,公良,拓跋,夹谷,宰父,谷梁,
晋楚,闫法,汝鄢,涂钦,段干,百里,东郭,南门,
呼延,归海,羊舌,微生,岳帅,缑亢,况郈,有琴,
梁丘,左丘,东门,西门,商牟,佘佴,伯赏,南宫,
墨哈,谯笪,年爱,阳佟,第五,言福'''

fx_list = fx.replace("\n", "").split(",")
fx_dict = {k: v for k, v in enumerate(fx_list)}
print(fx_dict)

输出结果如下图所示:

image.png

小伙伴们直呼好家伙,完美解决,

image.png

后面【(这是月亮的背面)】大佬提出不需要推导式,也可以实现,直接上代码,如下所示:

dict(enumerate(fx.replace('\n', '').split(',')))

实现的效果是一样的,如下图所示:

image.png

姓氏应该放在key上,索引值放到value上,方便索引查找的问题,可以根据实际需要和程序员的代码习惯去放键值的位置,至于具体的代码编写,就要根据需求了。

三、总结

大家好,我是皮皮。这篇文章基于粉丝提问,针对百家姓中姓氏排名问题,给出了具体说明和演示,顺利地帮助粉丝解决了问题。不过这里也只是针对该具体场景给出的答案,如果换个场景,可能就不太适用了。

[图片上传失败...(image-2f700-1648466003274)]

最后感谢粉丝【mofyl】提问,感谢【小王】、【德善堂小儿推拿-瑜亮老师】、【(这是月亮的背面)】、【dcpeng】、【冫马讠成】、【mofyl】、【东哥】大佬给予的支持和积极参与学习。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。