groups_per_user 函式接收一个字典,其中包含组名和用户串列。用户可以属于多个组。填写空白以回传一个字典,其中用户作为键,他们的组串列作为值。
这就是我所做的,但我没有得到预期的结果。
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:
new_user_groups = {user: group}
user_groups.update(new_user_groups)
else:
user_groups[user] = group
return(user_groups)
print(groups_per_user({"local": ["admin", "userA"],
"public": ["admin", "userB"],
"administrator": ["admin"] }))
# it gave me this:
{'admin': 'localpublicadministrator', 'userA': 'local', 'userB': 'public'}
#but I want this:
{'admin': ['local', 'public', 'administrator'], 'userA': ['local'], 'userB': ['public']}
uj5u.com热心网友回复:
改变
new_user_groups = {user: group}
user_groups.update(new_user_groups)
else:
user_groups[user] = group
到
user_groups[user] = [group]
else:
user_groups[user].append( group )
uj5u.com热心网友回复:
让我们看看如何简化它。首先,我们将获得一组所有用户名。
>>> d = {"local": ["admin", "userA"],
... "public": ["admin", "userB"],
... "administrator": ["admin"] }
>>> set(x for lst in d.values() for x in list(lst))
{'userB', 'admin', 'userA'}
>>> users = set(x for lst in d.values() for x in list(lst))
现在,我们将使用字典推导和d
and users
。以及里面的串列理解,以查找与给定用户名关联的所有角色。
>>> {name: [k for k, v in d.items() if name in list(v)] for name in users}
{'userB': ['public'], 'admin': ['local', 'public', 'administrator'], 'userA': ['local']}
>>>
uj5u.com热心网友回复:
dict.setdefault
或者collections.defaultdict
在这里作业得很好。如果 key 尚未存在(您设定为默认值),则dict.setdefault
方法设定。然后在每次迭代中,您只需将组名附加到适当的用户。所以只需更换user_groups[key]=default
user_groups
[]
if user not in user_groups:
new_user_groups = {user: group}
user_groups.update(new_user_groups)
else:
user_groups[user] = group
和
user_groups.setdefault(user, []).append(group)
您的功能将产生预期的结果。
如果您更喜欢使用collections.defaultdict
,您可以如下修改您的功能。与 类似dict.setdefault
,collections.defaultdict
为不存在的键提供默认值。您可以通过将串列建构式传递给 将空串列初始化为默认值collections.defaultdict
。
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)
输出:
{'admin': ['local', 'public', 'administrator'], 'userA': ['local'], 'userB': ['public']}
0 评论