miguo835 发表于 2020-6-24 10:04

最全的成语接龙代码(附带有网页版)

本帖最后由 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

0772boy 发表于 2020-6-29 11:01

miguo835 发表于 2020-6-28 08:52
网站上是一样的,网站上不可能在线计算,太耗时间了,查个词估计得一两分钟,所以直接生成固定的。python ...

感谢回复,没注意看。

手机没法评分。。回去用电脑了给你加分٩( ᐛ )( ᐖ )۶‬

miguo835 发表于 2020-6-28 08:52

0772boy 发表于 2020-6-27 02:51
想问一下,结果不随机吗。。。每次同一个字接下去的龙都一模一样

网站上是一样的,网站上不可能在线计算,太耗时间了,查个词估计得一两分钟,所以直接生成固定的。python代码是随机生成的。

caojiale 发表于 2020-6-24 13:57

楼主可以吧网站源码共享出来吗,研究研究

ciker_li 发表于 2020-6-24 22:15

有没有去重复?

miguo835 发表于 2020-6-26 16:13

ciker_li 发表于 2020-6-24 22:15
有没有去重复?

去了,这是必须的。

0772boy 发表于 2020-6-27 02:51

miguo835 发表于 2020-6-26 16:13
去了,这是必须的。

想问一下,结果不随机吗。。。每次同一个字接下去的龙都一模一样

闰土168 发表于 2020-6-29 15:55

可以,挺好的

fls 发表于 2020-6-29 16:22

点赞~之前看到个不管输入什么,都连接到‘一个顶俩’这个词语上的,可以共同学习下~

ykcbf 发表于 2020-7-15 15:08

运行后啥也没出现。
页: [1] 2
查看完整版本: 最全的成语接龙代码(附带有网页版)