201612-3权限查询(Python 100)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述思路:
创建一个字典,key = 用户名, value = 权限字典

# ['crm:2','git:2','git:3','game'] -->{'crm': 2, 'git': 3, 'game': [] ]}
# 经过合并处理后,将权限列表转化成字典
def transAutList(aut_list):
    aut_dict = dict()
    for item in aut_list:  # 'crm:2'
        type, *level = item.split(':')
        level = int(level[0]) if level else -1
        if type in aut_dict:
            aut_dict[type] = max(aut_dict[type], level)
        else:
            aut_dict[type] = level
    return aut_dict

# 函数丢弃 P 段的输入(没用)
def P():
    n = int(input())
    for _ in range(n): input()

# 对应题中的R段, 返回一个字典 ,key=roleName , value = 权限类别和等级对应的字典
def R():
    ret = dict()
    n = int(input())
    for _ in range(n):
        role, _, *pri_list = input().split()
        pri_dict = transAutList(pri_list)
        ret[role] = pri_dict
    return ret
    
# 返回key = PersonName, value = 权限字典的 一个字典
def U(rdict):
    n = int(input())
    ret = dict()
    for _ in range(n):  # alice 2 it qa
        name, _, *roles = input().split()
        mgPri = dict()
        # 开始合并角色的权限
        for role in roles:
            # 遍历角色对应的权限,并合并到pri中
            for k, val in rdict[role].items():
                # pri已经存在此命令,取最高权限
                if k in mgPri:
                    mgPri[k] = max(mgPri[k], val)
                else:
                    mgPri[k] = val
        ret[name] = mgPri
    return ret

if __name__ == '__main__':
    P()
    d = R()
    r = U(d)
    n = int(input())
    for _ in range(n):
        one_line = input().split()
        name = one_line[0]
        type, *lev = one_line[1].split(':')
        lev = int(lev[0]) if lev else -1
        # 不带等级查询
        if lev == -1:
            f = 'true' if name in r and type in r[name] else 'false'
            if f == 'true' and r[name][type]!=-1:
                f = r[name][type]
        else:
            if name not in r or type not in r[name]:
                f = 'false'
            else:
                f = 'true' if r[name][type] >= lev and r[name][type] != -1 else 'false'
        print(f)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值