我們查看一下數據的內容
我們主要的流程就是查詢文件,根據參數查詢相應格式的成語即可,這裏主要兩種查詢:按照關鍵字、按照成語格式(
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