我们查看一下数据的内容
我们主要的流程就是查询文件,根据参数查询相应格式的成语即可,这里主要两种查询:按照关键字、按照成语格式(
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 安之若素
安之若素
素不相识
识字知书
书声朗朗
朗朗乾坤
- 代码参考Github