【python練習(xí)】中國省市區(qū)菜單

一、練習(xí)要求

  • 從網(wǎng)上找到中國省市區(qū)的json或字典數(shù)據(jù)
  • 一屋剑、二茵臭、三級菜單分別對應(yīng)省市區(qū),且每個都有單獨的代碼
  • 省胧砰、市菜單有輸入對應(yīng)代碼進入下一級功能
  • 有返回上一級功能和退出機制

二鳍鸵、練習(xí)分析

2.1 獲取源數(shù)據(jù)

  1. 全國省市區(qū)json——來源于csdb,復(fù)制數(shù)據(jù)并另存為json格式尉间。(最好在復(fù)制后去在線json檢測網(wǎng)站檢查是否valid)

  2. 最新縣及縣以上行政區(qū)劃代碼——來源于統(tǒng)計局偿乖,復(fù)制成文本格式,后期再通過python來解析txt獲取并組成{(代碼哲嘲,侍靶健):{(代碼,市):{(代碼眠副,區(qū))}}}

  3. 直接通過統(tǒng)計局的網(wǎng)站画切,通過抓取來生成json文件(這個麻煩一些)

2.2 步驟分析

  1. 用函數(shù)來實現(xiàn)模塊很方便,新手練習(xí)還是逐層實現(xiàn)
  2. 進入程序囱怕,顯示省的名字和對應(yīng)數(shù)字列表霍弹,以三列的形式來顯示
  3. 提示輸入省級代碼,輸入正確則進入對應(yīng)市級列表娃弓;輸入非法則提示重新輸入典格;提示輸入‘q’來退出程序(用break循環(huán))
  4. 市級進到縣級同上;另外忘闻,提示輸入‘r’來返回上一級
  5. 縣級界面钝计,提示輸入‘r’來返回上一級,‘q’來退出程序
  6. 設(shè)立標(biāo)志位齐佳,整體用while來循環(huán)

三私恬、代碼實現(xiàn)

  • 以json方法來實現(xiàn)最為快捷
  • json文件命名為“City_json.json ”
  • 下面是版本一:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''China province to city, to district'''
__author__:'Wu HH'

# 導(dǎo)入json文件
import json
filename = 'City_json.json'
with open(filename, 'r') as file:
    china_data = json.load(file)

# 打印省級的函數(shù)
def print_pro():
    count = 0
    for i in range(len(china_data)):
        count += 1
        print(china_data[i]['name'].ljust(8,'>'),'%02d'.ljust(6,' ') % i, end='')
        # 用于打印成3列
        if count % 3 == 0:
            print('')

# 打印市級的函數(shù)
def print_city(city_num):
    count = 0
    for i in range(len(china_data[city_num]['city'])):
        count += 1
        print(china_data[city_num]['city'][i]['name'].ljust(8,'>'),'%02d'.ljust(6,' ') % i, end='')
        # 用于打印成3列
        if count % 3 == 0:
            print('')

# 打印縣級的函數(shù)
def print_area(city_num, area_num):
    count = 0
    for i in range(len(china_data[city_num]['city'][area_num]['area'])):
        count += 1
        print(china_data[city_num]['city'][area_num]['area'][i].ljust(8,'>'),'%02d'.ljust(6,' ') % i, end='')
        # 用于打印成3列
        if count % 3 == 0:
            print('')

# 定位標(biāo)志
loca_num = 0

while True:

    # 打印省級
    if loca_num == 0:
        print_pro()
        loca_num = 1

    if loca_num == 1:
        # 提示輸入省級編號進入市級,并提示q退出
        into_city_num = input('Please input number to get into city. "q" to quit. ')
        if into_city_num == 'q':
            break
        elif int(into_city_num) > 0 and int(into_city_num) <= len(china_data):
            into_city_num = int(into_city_num)
            if loca_num == 1:
                print_city(into_city_num)
            loca_num = 2
        else:
            print('please input a valid number')

    if loca_num == 2:
        # 提示輸入市級編號進入縣級炼吴,并提示q退出本鸣,r返回上一級
        into_area_num = input('Please input number to get into city. "q" to quit. "r" to return. ')
        if into_area_num == 'q':
            break
        elif into_area_num == 'r':
            loca_num = 0
            continue
        elif int(into_area_num) > 0 and int(into_area_num) <= len(china_data[into_city_num]['city']):
            into_area_num = int(into_area_num)
            if loca_num == 2:
                print_area(into_city_num, into_area_num)
            loca_num = 3
        else:
            print('please input a valid number')

    if loca_num == 3:
        # 提示q退出,r返回上一級
        input_in_area = input('"q" to quit. "r" to return. ')
        if input_in_area == 'q':
            break
        elif input_in_area == 'r':
            loca_num = 2
            print_city(into_city_num)
            continue
        else:
            print("please input a 'q' or 'r'")
  • 下面是優(yōu)化版本二:(網(wǎng)上找的博客園-金角大王)

  • 很佩服這個版本硅蹦,但是交互是通過輸入完成城市名而不是數(shù)字
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''more elegent version of China province program'''
__author__:'Wu HH'

# 導(dǎo)入json文件
import json
filename = 'City_json.json'
with open(filename, 'r') as file:
    china_data = json.load(file)

# 重組json成層疊字典{a:{b1:{c1:[]},c2:{}},b2:{...}...}
china_data_dic = {}
for province_total in china_data:
    city_temp = {}
    for city_total in province_total['city']:
        city_temp[city_total['name']] = city_total['area']
    china_data_dic[province_total['name']] = city_temp


exit_active = False

current_class = china_data_dic
parent_classes = [china_data_dic]

while not exit_active:
    count_num = 0
    for k in current_class:
        count_num += 1
        print(k.ljust(8, ' '),end='')
        if count_num % 3 == 0:
            print('')
    choice = input(">>:").strip()
    if choice == 'b' and parent_classes != []:
        current_class = parent_classes[-1]
        parent_classes.pop()
    elif choice == 'q':
        exit_active = True
    elif choice not in current_class:
        continue
    else:
        if current_class not in parent_classes:
            parent_classes.append(current_class)
        try:
            current_class = current_class[choice]
        except TypeError:
            continue

思考了好一會兒都沒想到怎么解決“縣級在非合法輸入后荣德,需要‘b’兩次才能返回市級”的bug闷煤。先留著,以后有空繼續(xù)思考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涮瞻,一起剝皮案震驚了整個濱河市鲤拿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌署咽,老刑警劉巖近顷,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宁否,居然都是意外死亡窒升,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門慕匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱须,“玉大人,你說我怎么就攤上這事台谊∪叵保” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵锅铅,是天一觀的道長督怜。 經(jīng)常有香客問我,道長狠角,這世上最難降的妖魔是什么号杠? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮丰歌,結(jié)果婚禮上姨蟋,老公的妹妹穿的比我還像新娘。我一直安慰自己立帖,他們只是感情好眼溶,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晓勇,像睡著了一般堂飞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绑咱,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天绰筛,我揣著相機與錄音,去河邊找鬼描融。 笑死铝噩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿克。 我是一名探鬼主播骏庸,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼毛甲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了具被?” 一聲冷哼從身側(cè)響起玻募,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎一姿,沒想到半個月后补箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡啸蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辈挂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衬横。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖终蒂,靈堂內(nèi)的尸體忽然破棺而出蜂林,到底是詐尸還是另有隱情,我是刑警寧澤拇泣,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布噪叙,位于F島的核電站,受9級特大地震影響霉翔,放射性物質(zhì)發(fā)生泄漏睁蕾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一债朵、第九天 我趴在偏房一處隱蔽的房頂上張望子眶。 院中可真熱鬧,春花似錦序芦、人聲如沸臭杰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴杆。三九已至,卻和暖如春宪塔,著一層夾襖步出監(jiān)牢的瞬間磁奖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工某筐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留点寥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓来吩,卻偏偏與公主長得像敢辩,于是被迫代替她去往敵國和親蔽莱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理戚长,服務(wù)發(fā)現(xiàn)盗冷,斷路器,智...
    卡卡羅2017閱讀 134,631評論 18 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,700評論 0 15
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,265評論 5 19
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 10,591評論 0 11
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫同廉、插件仪糖、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,060評論 4 62