问题是: 用户可以属于多个组。填写空白以返回
dictionary
,其中用户作为键,其组列表作为值。
我尝试做这个练习,但计算机不认为我的答案有效。我想这是因为
brackets
。
这是我的代码:
def groups_per_user(group_dictionary):
user_groups = {}
for group, user in group_dictionary.items():
for user in user:
if user not in user_groups:
user_groups[user] = group
else:
x = user_groups[user]
new_group={}
new_group = {user: [x,group]}
user_groups.update(new_group)
return(user_groups)
print(groups_per_user({"local": ["admin", "userA"],
"public": ["admin", "userB"],
"administrator": ["admin"] }))
我明白了
{'admin': [['local', 'public'], 'administrator'], 'userA': 'local', 'userB': 'public'}
我也尝试使用此代码来避免使用括号
> new_group = {user: [x,group]}
>
> new_group = {user: [str(x).lstrip('[').rstrip(']'),group]}
这次我得到:
{'admin': ["'local', 'public'", 'administrator'], 'userA': 'local', 'userB': 'public'}
两次均无效。
有更好的方法吗?
提前感谢大家的帮助
首先
for user in user:
将覆盖迭代变量。不要这样做。
第二:
user_groups[user] = group
这会将用户映射到组。相反,您可以直接使用
在此处创建组列表user_groups[user] = [group] # single element list
最后:
x = user_groups[user]
new_group={}
new_group = {user: [x,group]}
user_groups.update(new_group)
这些都不是必需的。您可以简单地将新组附加到现有用户列表中:
user_groups[user].append(group)
这给了我们:
def groups_per_user(group_dictionary):
user_groups = {}
for group, users in group_dictionary.items():
for user in users:
if user not in user_groups:
user_groups[user] = [group]
else:
user_groups[user].append(group)
return user_groups
print(groups_per_user({"local": ["admin", "userA"],
"public": ["admin", "userB"],
"administrator": ["admin"]}))
输出:
{'admin': ['local', 'public', 'administrator'], 'userA': ['local'], 'userB': ['public']}
您可以使用defaultdict来实现这一点并避免使用if-else条件
from collections import defaultdict
def groups_per_user(group_dictionary):
user_groups = defaultdict(list)
for group, users in group_dictionary.items():
for user in users:
user_groups[user].append(group)
return user_groups # return dict(user_groups) if you want it to be returned in dict format
print(groups_per_user({"local": ["admin", "userA"],
"public": ["admin", "userB"],
"administrator": ["admin" ]}))