跳转至

Python练习:字典

题目1

点击这里下载文件 解压后得到文件 0016_1.txt

这个是一个数据文件,格式如下

薛蟠     4560 42
薛蝌     4460 25
薛宝钗   5776 43
薛宝琴   4346 42
王夫人   3360 25
王熙凤   4460 35
王子腾   5660 45
王仁     5034 65
尤二姐   5324 25
贾芹   5663 25
贾蓉     3446 15
贾兰     3443 35
贾芸     4522 25
尤三姐   5905 45
贾珍     4603 25

这里面有3列数据,分别 保存了 游戏系统的用户名, 用户积分 , 年龄

现在要求大家写一个程序,计算出同一姓氏的人的积分总和。

输出结果格式如下:

 : 19142
 : 18514
 : 11229
 : 21677

答案视频讲解


请大家点击此处链接,观看讲解视频

题目2

下面的字典里面记录了一个游戏系统中用户的信息。 其中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 退出。

视频讲解

和VIP学员讲解本题的开发思路


补充练习

VIP实战班学员请联系老师获取补充练习,并做阶段学习交流

您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况

题目1-答案

with open('0016_1.txt',encoding='utf8') as f:
    infoList = f.read().splitlines()

coinTable = {}

for info in infoList:
    # 先去除左右空白字符
    info = info.strip()
    if not info:
        continue

    parts = info.split(' ')
    name = parts[0]
    coin = int(parts[-2])


    # 如果姓氏还没有在统计表中
    # 创建新元素
    if name[0] not in coinTable:
        coinTable[name[0]] = coin

    # 如果姓氏已经在统计表中
    # 累加积分
    else:
        coinTable[name[0]] += coin

for name1,coins in coinTable.items():
    print(f'{name1} : {coins}')

题目2-答案

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