为了账号安全,请及时绑定邮箱和手机立即绑定

成语查询工具 - 执行参数设定

标签:
Python

我们查看一下数据的内容

图片描述

    我们主要的流程就是查询文件,根据参数查询相应格式的成语即可,这里主要两种查询:按照关键字、按照成语格式(AABB等),可以通过length参数设定返回的数据长度,同时提供交互模式操作以及成语接龙的游戏模式

1. 参数设定

通过argparse进行参数配置,详情参考之前关于argparse的文章

    parser = argparse.ArgumentParser()
    parser.add_argument("-t", "--type", type=str, choices=["AABB", "ABCC", "AABC", "ABAC", "ABCA",
                                                           "ABBC", "ABCB", "ABCC"],
                        help="search the idiom by type")
    parser.add_argument("-i", "--interaction", help="enter the type of interaction",
                        action="store_true")
    parser.add_argument("-k", "--key", type=str, help="search idiom by key word",)
    parser.add_argument("-l", "--length", type=int, default=30,
                        help="search the idiom by type")
    parser.add_argument("-g", "--game", type=str,
                        help="enter the game")

    args = parser.parse_args()

2. 通过类型检索

    这里限定了几种类型的格式,除此之外的类型都会返回默认提示,通过idiom_type返回type类型,通过返回的类型调用search_by_type查询相应数据,最后根据length等其他参数做数据处理,如果同时指定了length长度则按长度返回,未指定就按默认长度返回

def idiom_type(idiom):
    if idiom[0] == idiom[1] and idiom[2] == idiom[3] and idiom[1] != idiom[2]:
        return "AABB"
    elif idiom[0] != idiom[1] and idiom[0] != idiom[2] and idiom[1] != idiom[2] and idiom[2] == idiom[3]:
        return "ABCC"
    elif idiom[0] == idiom[1] and idiom[2] != idiom[3] and idiom[1] != idiom[2]:
        return "AABC"
    elif idiom[0] != idiom[1] and idiom[0] == idiom[2] and idiom[0] != idiom[3] and idiom[1] != idiom[3]:
        return "ABAC"
    elif idiom[0] == idiom[3] and idiom[0] != idiom[1] and idiom[0] != idiom[2] and idiom[1] != idiom[2]:
        return "ABCA"
    elif idiom[0] != idiom[1] and idiom[0] != idiom[3] and idiom[1] != idiom[3] and idiom[1] == idiom[2]:
        return "ABBC"
    elif idiom[0] != idiom[1] and idiom[0] != idiom[2] and idiom[1] == idiom[3] and idiom[1] != idiom[2]:
        return "ABCB"
    else:
        return "other"


def search_by_type(type, idioms, context):
    for k, v in idioms.items():
        if len(k) == 4 and idiom_type(k) == type:
            context[k] = v
    return context


def result_by_key_type(key, type, args, file, length=-1):
    result = search_by_key_type(key, type, get_data(file), {}, [])
    if length != -1:
        args.length = length
    if len(result) > args.length:
        keys = []
        print("*************************************")
        print("****成语 :释义**********************")
        for index, key in enumerate(result):
            if index < args.length:
                keys.append(key)
        for k, v in result.items():
            if k in keys:
                print(k + " : " + v)
    else:
        if len(result) == 0:
            print("未找到相关项")
        else:
            print("*************************************")
            print("****成语 :释义**********************")
            for k, v in result.items():
                print(k + " : " + v)

3. 按照关键字检索

    通过关键字在数据中查询成语或者释义中包含关键字的数据并返回,其他和通过类型检索相似

def search_by_key(key, idioms, context):
    for k, v in idioms.items():
        if key in k or key in v:
            context[k] = v
    return context


def result_by_key(key, args, file, length=-1):
    key_result = search_by_key(key, get_data(file), {})
    if length != -1:
        args.length = length
    if len(key_result) > args.length:
        keys = []
        print("*************************************")
        print("****成语 :释义**********************")
        for index, key in enumerate(key_result):
            if index < args.length:
                keys.append(key)
        for k, v in key_result.items():
            if k in keys:
                print(k + " : " + v)
    else:
        if len(key_result) == 0:
            print("未找到相关项")
        else:
            print("*************************************")
            print("****成语 :释义**********************")
            for k, v in key_result.items():
                print(k + " : " + v)

4. 通过类型和关键字的组合形式检索

    相当于上面两项的组合,首先对类型进行检索,对于返回的数据再进行关键字过滤

def search_by_key_type(key, type, idioms, context, keys):
    for k, v in idioms.items():
        if key in k or key in v:
            keys.append(k)
    for k, v in idioms.items():
        if k in keys and len(k) == 4 and idiom_type(k) == type:
            context[k] = v
    return context


def result_by_key_type(key, type, args, file, length=-1):
    result = search_by_key_type(key, type, get_data(file), {}, [])
    if length != -1:
        args.length = length
    if len(result) > args.length:
        keys = []
        print("*************************************")
        print("****成语 :释义**********************")
        for index, key in enumerate(result):
            if index < args.length:
                keys.append(key)
        for k, v in result.items():
            if k in keys:
                print(k + " : " + v)
    else:
        if len(result) == 0:
            print("未找到相关项")
        else:
            print("*************************************")
            print("****成语 :释义**********************")
            for k, v in result.items():
                print(k + " : " + v)

5. 交互模式

    通过命令执行进入交互模式,按照提示输入相应项即可,输入错误项或者不输入都会按照默认的值作为输入,相当于将前面3种类型功能组合为交互模式,这里重写了input方法,如果输入不是正确的格式则按照默认值作为输入项

def input_or_default_num(default, hint):
    data = input(hint)
    if data.isdigit():
        return eval(data)
    else:
        return default


def input_or_default_key(default, hint):
    key = input(hint)
    if key:
        return key
    else:
        return default

def input_or_default_type(default, hint):
    types = ['AABB', 'ABCC', 'AABC', 'ABAC', 'ABCA', 'ABBC', 'ABCB']
    type = input(hint)
    if type in types:
        return type
    else:
        return default


def search_by_interaction(args, file):
    print("*************************************")
    print("1)      By Type      ****************")
    print("2)      By Key_Word  ****************")
    print("3)      By Key_Word & Type **********")
    print("4)      Game ************************")
    print("5)      Exit  ***********************")
    print("*************************************")
    num = input_or_default_num(1, "****please input search method(Default: By Type)**************\n")
    if num == 2:
        key = input_or_default_key("安", "please your key(Default: 安)\n")
        length = input_or_default_num(10, "please the number of idioms(Default:10)\n")
        result_by_key(key, args, file, length)
    elif num == 3:
        key = input_or_default_key("安", "please your key(Default: 安)\n")
        type = input_or_default_type("AABB", "please your type(Default:AABB)\n")
        length = input_or_default_num(10, "please the number of idioms(Default:10)\n")
        result_by_key_type(key, type, args, file, length)
    elif num == 4:
        game(file)
    elif num == 5:
        exit()
    else:
        print("**************      Type     ****************************")
        print("**************      AABB   :平平安安    ****************")
        print("**************      ABCC   :喜气洋洋    ****************")
        print("**************      AABC   :鼎鼎大名    ****************")
        print("**************      ABAC   :不声不响    ****************")
        print("**************      ABCA   :贼喊捉贼    ****************")
        print("**************      ABBC   :自欺欺人    ****************")
        print("**************      ABCB   :爱理不理    ****************")
        print("*********************************************************")
        type = input_or_default_type("AABB", "please your type(Default:AABB)\n")
        length = input_or_default_num(10, "please the number of idioms(Default:10)\n")
        result_by_type(type, args, file, length)

6. 游戏-成语接龙

    按照输入的字符串检索,字符串的最后一个字符作为下一个成语的第一个字符,从返回的成语数据中随机打印一个并将这个成语作为下一个的输入项,一直执行直到没有想要的成语位置(打印所有满足条件的成语)

def input_or_default_key(default, hint):
    key = input(hint)
    if key:
        return key
    else:
        return default


def game(file, key=None):
    key = key if key else input_or_default_key('安之若素', 'please the first idiom\n')
    print(key)
    while next_idiom(key, get_data(file), []):
        key = next_idiom(key, get_data(file), [])
        print(key)

执行

I. 按照类型

python query.py --type AABB -l 3
*************************************
****成语 :释义**********************
安安稳稳 : 形容十分安定稳当。
肮肮脏脏 : 不干净。比喻卑鄙、丑恶
安安逸逸 : 安闲舒适,自由自在

python query.py --t AABB -l 3
*************************************
****成语 :释义**********************
安安稳稳 : 形容十分安定稳当。
肮肮脏脏 : 不干净。比喻卑鄙、丑恶
安安逸逸 : 安闲舒适,自由自在

python query.py --t AHCG
usage: query.py [-h] [-t {AABB,ABCC,AABC,ABAC,ABCA,ABBC,ABCB,ABCC}] [-i]
                [-k KEY] [-l LENGTH] [-g GAME]
query.py: error: argument -t/--type: invalid choice: 'AHCG' (choose from 'AABB', 'ABCC', 'AABC', 'ABAC', 'ABCA', 'ABBC', 'ABCB', 'ABCC')


II. 按照关键字

python query.py --key 安 -l 3
*************************************
****成语 :释义**********************
安乐窝 : 泛指安静舒适的住处。
风清弊絶 : 谓社会风气良好,营私舞弊的事情绝迹。 宋  周敦颐 《拙赋》:“天下拙,刑政徹,上安下順,風清
成羣结伙 : 犹成群结队。谓众多的人或动物聚结成一群群、一伙伙。《儿女英雄传》第三二回:“料着 安老爺 家

python query.py -k 安 -l 3
*************************************
****成语 :释义**********************
安乐窝 : 泛指安静舒适的住处。
风清弊絶 : 谓社会风气良好,营私舞弊的事情绝迹。 宋  周敦颐 《拙赋》:“天下拙,刑政徹,上安下順,風清
成羣结伙 : 犹成群结队。谓众多的人或动物聚结成一群群、一伙伙。《儿女英雄传》第三二回:“料着 安老爺 家

python query.py -k  -l 3
usage: query.py [-h] [-t {AABB,ABCC,AABC,ABAC,ABCA,ABBC,ABCB,ABCC}] [-i]
                [-k KEY] [-l LENGTH] [-g GAME]
query.py: error: argument -k/--key: expected one argument

III. 类型 + 关键字

python query.py --type AABB --key 安 -l 3
*************************************
****成语 :释义**********************
安安稳稳 : 形容十分安定稳当。
安安逸逸 : 安闲舒适,自由自在
安安心心 : 保持心境平静,不受外界干扰

python query.py -t AABB -k 安 -l 3
*************************************
****成语 :释义**********************
安安稳稳 : 形容十分安定稳当。
安安逸逸 : 安闲舒适,自由自在
安安心心 : 保持心境平静,不受外界干扰

IV. 交互模式

python query.py -i
*************************************
1)      By Type      ****************
2)      By Key_Word  ****************
3)      By Key_Word & Type **********
4)      Game ************************
5)      Exit  ***********************
*************************************
****please input search method(Default: By Type)**************
3
please your key(Default: 安)
安
please your type(Default:AABB)
AABC
please the number of idioms(Default:10)
3
*************************************
****成语 :释义**********************
安安合适 : 刚刚适合,恰好相合
惶惶不安 : 惶惶:恐惧不安。指心中惊慌害怕;心神不安定。
人人自危 : 每一个人都感到随时有危险出现而恐惧不安。

V. 游戏-成语接龙

python query.py -g 安
安
安土重居
居敬穷理
理所必然
然糠照薪
薪尽火灭
灭门绝户
户枢不朽
朽木粪土
土龙刍狗
狗党狐朋
朋心合力
力有未逮

>python query.py --game 安之若素
安之若素
素不相识
识字知书
书声朗朗
朗朗乾坤

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消