本帖最后由 miguo835 于 2020-6-24 14:02 编辑
初学python 突然想弄个成语接龙的代码,在网上找了一遍,很多都是不全面,于是自己试着写了个,里边包含同字成语,同音成语,同字接龙,同音接龙。代码如下,注意,同音接龙比较吃性能。
[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[0]:
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])[0][0]==i["pinyin"][0]:
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[0])
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[0]:
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])[0][0]==i["pinyin"][0]:
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 |