Python练习:字典

题目1

下面的字典里面记录了一个游戏系统中用户的信息。 其中key 是用户的ID, value 是另外一个字典,记录了用户名,用户等级和金币数量。

members = {
    1 :{'name':'白月黑羽', 'level':3, 'coins':300},
    2 :{'name':'短笛魔王', 'level':5, 'coins':330},
    3 :{'name':'紫气一元', 'level':6, 'coins':340},
    4 :{'name':'拜月主',   'level':3, 'coins':32200},
    5 :{'name':'诸法空',   'level':4, 'coins':330},
    6 :{'name':'暗光城主', 'level':3, 'coins':320},
    7 :{'name':'心魔尊',   'level':3, 'coins':2300},
    8 :{'name':'日月童子', 'level':8, 'coins':3450},
    9 :{'name':'不死尸王', 'level':3, 'coins':324},
    10:{'name':'天池剑尊', 'level':9, 'coins':13100},
}

要求大家写一个程序,运行的时候先显示如下主菜单

请选择操作选项:
   1 查看用户账号信息
   2 添加用户
   3 删除用户
   4 列出所有用户信息
   0 退出

如果用户选择 1 选项, 再次提示用户输入账号名, 用户输入账号后,显示该用户的 ID, 等级和 金币数量。

如果用户选择 2 选项, 提示用户输入账号名、等级、金币数量。 用户输入后,要检查该账号名是否已经存在,如果已经存在,则提示用户重新输入。如果用户输入的账号不存在,则添加该信息到字典中。

如果用户选择 3 选项, 提示用户输入账号名。 用户输入后,要检查该账号名是否已经存在,如果不存在,则提示用户重新输入。如果用户输入的账号存在,在用户字典中删除该账号。

如果用户选择 4 选项,则打印出当前用户表里所有用户的信息

如果用户选择 0 选项, 则退出程序。

只要不是选择退出,用户操作完后,再次进入主菜单,让用户再次选择。如此循环,直到用户选择0 退出。

答案与解析

















































题目1-答案

from pprint import pprint

members = {
    1 :{'name':'白月黑羽', 'level':3, 'coins':300},
    2 :{'name':'短笛魔王', 'level':5, 'coins':330},
    3 :{'name':'紫气一元', 'level':6, 'coins':340},
    4 :{'name':'拜月主',   'level':3, 'coins':32200},
    5 :{'name':'诸法空',   'level':4, 'coins':330},
    6 :{'name':'暗光城主', 'level':3, 'coins':320},
    7 :{'name':'心魔尊',   'level':3, 'coins':2300},
    8 :{'name':'日月童子', 'level':8, 'coins':3450},
    9 :{'name':'不死尸王', 'level':3, 'coins':324},
    10:{'name':'天池剑尊', 'level':9, 'coins':13100},
}


# 因为要根据用户名查找用户信息,需要改变字典格式
# 以用户名为key,创建一个字典

name2info = {}
for k,v in members.items():
    name = v['name']
    # 因为id也是要查询的内容,加到 字典的 value值中
    v['id'] = k
    name2info[name] = v


# 定义查看用户账号的处理函数
def checkAccount():
    name = input('请输入查找的用户账号:')
    if name not in name2info:
        print(f'对不起,账号 {name} 不存在.')
        return
    
    info = name2info[name]
    print(f'账号: {name} , ID : {info["id"]} , 等级:{info["level"]} , 金币:{info["coins"]} ')    


# 定义添加用户账号的处理函数
def addAccount():
    while True:
        name = input('请输入添加用户的账号:')
        if name in name2info:
            print('对不起,该账号已经存在')
        else:
            break
    
    while True:
        level = input('请输入该用户的等级:')
        # 如果不是数字 , 则输入格式错误
        if not level.isdigit():
            print('对不起,等级必须为一个数字')
        else:
            level = int(level) # 转化为整数
            break

            
    while True:
        coins = input('请输入该用户的金币数量:')
        # 如果不是数字 , 则输入格式错误
        if not coins.isdigit():
            print('对不起,金币数 必须为一个数字')
        else:
            coins = int(coins) # 转化为整数
            break

    # 要产生一个不存在的ID号, 这里我们取 当前最大的ID号+ 1
    newId = max(members.keys()) + 1
    # 注意: 两个字典里面都要添加
    members[newId] =  {'name':name, 'level':level, 'coins':coins}
    name2info[name] = {'name':name, 'level':level, 'coins':coins, 'id':newId}


# 定义删除用户账号的处理函数
def delAccount():
    name = input('请输入要删除的用户账号:')
    if name not in name2info:
        print(f'对不起,账号 {name} 不存在.')
        return

    # 注意: 两个字典里面都要删除
    theID = name2info[name]['id']
    name2info.pop(name)
    members.pop(theID)
    

# 定义打印表内容的处理函数
def showTables():    
    print('\n现在name2info的表内容是:\n')
    pprint(name2info)
    print('\n现在members的表内容是:\n')
    pprint(members)



menu = '''
请选择操作选项:
   1 查看用户账号信息
   2 添加用户
   3 删除用户
   4 列出所有用户信息
   0 退出
'''   
# 显示主菜单
while True:
    choice = input(menu)

    # 选择查看查看用户账号
    if choice == '1':
        checkAccount()
    elif choice == '2':
        addAccount()
    elif choice == '3':
        delAccount()
    elif choice == '4':
        showTables()
    elif choice == '0':
        break