最全的成语接龙代码(附带有网页版)
本帖最后由 miguo835 于 2020-6-24 14:02 编辑初学python 突然想弄个成语接龙的代码,在网上找了一遍,很多都是不全面,于是自己试着写了个,里边包含同字成语,同音成语,同字接龙,同音接龙。代码如下,注意,同音接龙比较吃性能。
import json,os
import random
import pypinyin
#idiom_pingyin.json包含成语与拼音
with open('idiom_pingyin.json',encoding='utf-8') as f:
idiom_list = json.load(f)#读取的是列表数据。列表中元素为字典
#存储成语为列表
list_idio=[]
for i in idiom_list:
list_idio.append(i['idio'])
#首尾同字循环成语接龙
class SameZi:
list1=[]
def load_idiom(self,idio):
res=[]
for i in list_idio:
if idio[-1]==i:
res.append(i)
if len(self.list1)<35:
if res:
nose=random.choice(res)
self.list1.append(nose)
self.load_idiom(nose)
return self.list1
# 运行多次次,取最长的成语接龙。
def genter_idiom(self,word):
loop=[]
i=1
while i<30: #回调运行30次,数字可以自己更改,数字越大,运行结果越精准。
loop1=self.load_idiom(word)
print(len(loop1))
if len(loop)<len(loop1):
loop=loop1[:]
self.list1.clear()
i=i+1
print(loop)
return loop
#首尾同音成语接龙循环(运行过程很慢)
class SameYin:
list_py=[]
def py_idiom(self,idio):
res=[]
for i in idiom_list:
#拼音方法返回的是个列表包含列表 如'阿保之功': [['ā'], ['bǎo'], ['zhī'], ['gōng']]
if pypinyin.pinyin(idio[-1])==i["pinyin"]:
res.append(i["idio"])
if len(self.list_py)<30 :
if res:
nose=random.choice(res) #从列表中随机取个成语,继续查找下一个
self.list_py.append(nose)
self.py_idiom(nose)
return self.list_py
# 运行10次,取最长的成语接龙。
def genter_py(self,words):
loop=[]
i=1
while i<10: #循环运行10次,数字可以更改,看电脑性能。
loop1=self.py_idiom(words)
print(len(loop1))
if len(loop)<len(loop1):
loop=loop1[:]
self.list_py.clear()
i=i+1
#添加拼音
idiomandpy=[]
for a in loop:
#拼音方法返回的是个列表包含列表 如'阿保之功': [['ā'], ['bǎo'], ['zhī'], ['gōng']]
idpy=pypinyin.pinyin(a)
list_text=[]
for b in idpy:
list_text.append(b)
cont_py=" ".join(list_text)
content=a+"("+cont_py+")"
idiomandpy.append(content)
print(idiomandpy)
return idiomandpy
#同字成语
def one_zi(keyword):
set_idiom=[]
for item in list_idio:
if keyword[-1]==item:
set_idiom.append(item)
print(set_idiom)
print(len(set_idiom))
return set_idiom
#同音成语
def one_yin(keyword):
set_yidiom=[]
for i in idiom_list:
if pypinyin.pinyin(keyword[-1])==i["pinyin"]:
pycont=' '.join(i["pinyin"])
cont=i["idio"]+"("+pycont+")"
set_yidiom.append(cont)
print(set_yidiom)
print(len(set_yidiom))
return set_yidiom
#生成结果
def create(word):
result_dict={}
tongying=one_yin(word)
result_dict["同音成语"]=tongying
tongzi=one_zi(word)
result_dict["同字成语"]=tongzi
samezi=SameZi().genter_idiom(word)
result_dict["同字接龙"]=samezi
#同音循环运行较慢,有需要自己开启
# sameyin=SameYin().genter_py(word)
# result_dict["同音接龙"]=sameyin
print(result_dict)
if __name__=="__main__":
create("大")
为了方便使用,专门弄了个成语接龙的网站, 便于查询,网址:https://ciyuquan.com/ ,网站做的比较简陋,还有很多BUG,将就着用吧。
代码里面用到的json数据:https://ciyuquan.com/daquan/idiom_pingyin.json miguo835 发表于 2020-6-28 08:52
网站上是一样的,网站上不可能在线计算,太耗时间了,查个词估计得一两分钟,所以直接生成固定的。python ...
感谢回复,没注意看。
手机没法评分。。回去用电脑了给你加分٩( ᐛ )( ᐖ )۶ 0772boy 发表于 2020-6-27 02:51
想问一下,结果不随机吗。。。每次同一个字接下去的龙都一模一样
网站上是一样的,网站上不可能在线计算,太耗时间了,查个词估计得一两分钟,所以直接生成固定的。python代码是随机生成的。 楼主可以吧网站源码共享出来吗,研究研究 有没有去重复? ciker_li 发表于 2020-6-24 22:15
有没有去重复?
去了,这是必须的。 miguo835 发表于 2020-6-26 16:13
去了,这是必须的。
想问一下,结果不随机吗。。。每次同一个字接下去的龙都一模一样 可以,挺好的 点赞~之前看到个不管输入什么,都连接到‘一个顶俩’这个词语上的,可以共同学习下~ 运行后啥也没出现。
页:
[1]
2