Python_三级目录

程序要求:

1. 使用字典存储

1. 可以一层一层的进入到所有层
2. 可以在每层返回上一层
3. 可以在任意层退出

 

  三级目录写了两个版本,第一个版本是刚看完字典写出来的,代码很多冗余,很多重复。

menu = {
    '北京':{
        '朝阳':{
            '国贸':{
                'CICC':{},
                'HP':{},
                '渣打银行':{},
                'CCTV':{}
            },
            '望京':{
                '陌陌':{},
                '阿里巴巴':{},
                '奔驰':{}
            },
            '三里屯':{
                '优衣库':{},
                'apple':{},
            }
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '阿泰包子':{}
            },
            '天通苑':{
                '链家':{},
                '我爱我家':{},
            },
            '回龙观':{}
        },
        '海淀':{
            '五道口':{
                '谷歌':{},
                '网易':{},
                'Sogo':{},
                '快手':{},
            },
        },
        '中关村':{
            '优酷':{},
            '爱奇艺':{},
            '腾讯':{},
            '汽车之家':{},
            '新东方':{},
        }
    },
    '上海':{
        '浦东':{
            '陆家嘴':{
                'CICC':{},
                '高盛':{},
                '摩根':{},
            },
            '外滩':{}
        },
        '闵行':{},
        '静安':{},
    },
    '山东':{
        '济南':{},
        '德州':{
            '乐陵':{
                '丁务镇':{},
                '城区':{},
            },
            '虞城':{},
            '平原县':{},
        },
        '青岛':{},
    }
}

back_flag = False
quit_flag = False


while not back_flag and not quit_flag:
    for key in menu:
        print(key)
    choice = input('>>:').strip()
    if choice in menu:
        while not back_flag and not quit_flag:
            for key_2 in menu[choice]:
                print(key_2)
            choice_2 = input('2>>:').strip()
            if choice_2 == 'b':
                back_flag = True
            if choice_2 == 'q':
                quit_flag = True
            if choice_2 in menu[choice]:
                while not back_flag and not quit_flag:
                    for key_3 in menu[choice][choice_2]:
                        print(key_3)
                    choice_3 = input('3>>:').strip()
                    if choice_3 == 'b':
                        back_flag = True
                    if choice_3 == 'q':
                        quit_flag = True
                    if choice_3 in menu[choice][choice_2]:
                        while not back_flag and not quit_flag:
                            for key_4 in menu[choice][choice_2][choice_3]:
                                print(key_4)
                            print('last level!!')
                            choice_4 = input('4>>:').strip()
                            if choice_4 == 'b':
                                back_flag = True
                            if choice_4 == 'q':
                                quit_flag = True
                        else:
                            back_flag = False
                else:
                    back_flag = False
        else:
            back_flag = False
View Code

 

  第二个版本,代码部分比较精炼,偷师于老男孩。

menu = {
    '北京':{
        '朝阳':{
            '国贸':{
                'CICC':{},
                'HP':{},
                '渣打银行':{},
                'CCTV':{}
            },
            '望京':{
                '陌陌':{},
                '阿里巴巴':{},
                '奔驰':{}
            },
            '三里屯':{
                '优衣库':{},
                'apple':{},
            }
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '阿泰包子':{}
            },
            '天通苑':{
                '链家':{},
                '我爱我家':{},
            },
            '回龙观':{}
        },
        '海淀':{
            '五道口':{
                '谷歌':{},
                '网易':{},
                'Sogo':{},
                '快手':{},
            },
        },
        '中关村':{
            '优酷':{},
            '爱奇艺':{},
            '腾讯':{},
            '汽车之家':{},
            '新东方':{},
        }
    },
    '上海':{
        '浦东':{
            '陆家嘴':{
                'CICC':{},
                '高盛':{},
                '摩根':{},
            },
            '外滩':{}
        },
        '闵行':{},
        '静安':{},
    },
    '山东':{
        '济南':{},
        '德州':{
            '乐陵':{
                '丁务镇':{},
                '城区':{},
            },
            '虞城':{},
            '平原县':{},
        },
        '青岛':{},
    }
}

lader = menu
apper_levels = []

while True:
    for key in lader:
        print(key)
    choice = input('>>>:').strip()
    if choice in lader:
        apper_levels.append(lader)                      # 次步是重点,第一次执行便将字典以列表的形式保存,每进入一层,便将父级目录追加到后边,用于退出次层时直接提取,保证永远包含字典,并进一层,追加一层。
        lader = lader[choice]
    elif choice == 'q':
        if apper_levels:
            lader = apper_levels.pop()                  # 提取的是进入某层后的上一层信息,是在上边标注的地方进行的追加。
View Code

 

 

2. 使用文件存储数据

1. 展示省市县(数据存在文件中)
2. 对菜单实现增(add)删(del)改(replace)查(到某一级目录可以让用户选择增加是否添加当级目录的省市县,还是存放到文本中)

 

程序涉及方法:

  字符串转为字典

a = str({'bj':{'1':111}})
print(type(a))
print(a)
a = eval(a)
print(type(a))

 

程序使用字典文件(文件名china):

{
    '北京':{
        '朝阳':{
            '国贸':{},
            '望京':{},
            '三里屯':{}
        },
        '昌平':{
            '沙河':{},
            '天通苑':{},
            '回龙观':{}
        },
        '海淀':{
            '五道口':{},
        },
        '中关村':{}
    },
    '上海':{
        '浦东':{
            '陆家嘴':{},
            '外滩':{}
        },
        '闵行':{},
        '静安':{},
    },
    '山东':{
        '济南':{},
        '德州':{
            '乐陵':{},
            '虞城':{},
            '平原县':{},
        },
        '青岛':{},
    }
}
View Code

 

 

程序代码:

with open('china', 'r', encoding='utf8') as file:
    china_str = file.read().strip()
    pass

mean = eval(china_str)
leader = mean
apper_leves = []                                                                                # 用于记录返回值

flag = False

while not flag:
    for key in leader:
        print(key)
    choose = input('此页面支持增加(add)、删除(del)、修改(replace)、查看(直接输入省市县)、后退请按"b":')
    # 查询
    if choose in leader:
        apper_leves.append(leader)
        leader = leader[choose]

    # 增加
    elif choose == 'add':
        user_add = input('输入想要增加的地区:')
        if user_add in leader:
            print('输入的已存在!')
        else:
            leader[user_add] = {}

    # 删除
    elif choose == 'del':
        user_del = input('输入想要删除的地区:')
        if user_del not in leader:
            print('删除地区不存在!')
        else:
            del leader[user_del]

    # 修改
    elif choose == 'replace':
        user_rep_bef = input('请输入想要修改的地区:')
        if user_rep_bef not in leader:
            print('修改地区不存在!')
        else:
            user_rep_aft = input('请输入修改后的地区名称:')
            leader[user_rep_aft] = leader[user_rep_bef]                                         # 重点,将老键的值赋给新键,并删除老键
            del leader[user_rep_bef]

    # 后退及退出
    elif choose == 'b':
        if apper_leves:
            leader = apper_leves.pop()
        else:
            print('已是最上级菜单,输入“b”退出')                                                # 重点,如直接退出,字典并没有返回最上级目录,无法输出到文件
            flag = True
    else:
        print('非法输入,请重新输入!')

with (open('old_wang', 'w', encoding='utf8')) as f:
    f.write(str(leader))
    pass
View Code

 

posted @ 2017-11-13 23:19  隔壁王师傅  阅读(407)  评论(0编辑  收藏  举报