Python识别用户违规角色组合时结果缺失的问题排查
问题原因分析
你的代码有三处核心逻辑错误,共同导致了结果遗漏:
- 没有先收集单个用户的所有角色,就提前做违规检查。原代码遍历单个用户的单条角色记录时,仅向temp中添加当前单个角色,检查完就清空temp,导致temp中永远只有1个角色,本来就无法正常匹配需要两个角色同时存在的违规组合,你得到的部分结果实际是错误的条件判断误判出来的。
- 违规判断条件语法逻辑错误。
if z[0] and z[1] in temp的实际含义是「z[0] 非空字符串(永远为真)」且「z[1] 在temp中」,并不是你预期的「z的两个元素都在temp中」,正确写法是if z[0] in temp and z[1] in temp。 - 匹配到一个违规组合就用
break跳出循环,会漏掉同一个用户的其他违规组合。比如Brandon同时持有三个角色,对应三个违规组合,break之后只会返回第一个匹配到的结果,剩下的组合直接被跳过,这就是('Editor', 'User')被遗漏的直接原因。
修正后的参考代码
from itertools import groupby Role = [('Amy', 'Administrator'), ('Brandon', 'Editor'), ('Brandon', 'User'), ('Eric', 'User'), ('Brandon', 'Administrator'), ('Eric', 'Administrator')] Unwanted = [('Administrator', 'Editor'), ('Administrator', 'User'), ('Editor', 'User')] Role.sort() results = [] # 按用户名分组,先收集每个用户的全部角色 for username, role_group in groupby(Role, lambda x: x[0]): role_set = {item[1] for item in role_group} # 遍历所有违规组合,逐一检查是否符合 for invalid_pair in Unwanted: if invalid_pair[0] in role_set and invalid_pair[1] in role_set: results.append(f"{username}:{invalid_pair}") print(results)
运行后输出和预期完全一致:
["Brandon:('Administrator', 'Editor')", "Brandon:('Administrator', 'User')", "Brandon:('Editor', 'User')", "Eric:('Administrator', 'User')"]
内容的提问来源于stack exchange,提问作者Counting JR
相关产品推荐
相关产品推荐

