拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 将字典的值转换为串列

将字典的值转换为串列

白鹭 - 2022-02-11 2000 0 0

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))

现在,我们将使用字典推导和dand 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]=defaultuser_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.setdefaultcollections.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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *