首页 > 解决方案 > 如何将值分配给字典中的键?解决算法

问题描述

groups_per_user 函数接收一个字典,其中包含组名和用户列表。就像 Linux 系统中的组一样。用户可以属于多个组。填写空白以返回一个字典,其中用户作为键,他们的组列表作为值。

基本上我正在尝试将组分配给用户而不是用户分配给组

这就是我到目前为止所尝试的:

def groups_per_user(group_dictionary):
    user_groups = {}
    groups = []
    # Go through group_dictionary
    for group,users in group_dictionary.items():
        # Now go through the users in the group
        for user in users:
        # Now add the group to the list of
          # groups for this user, creating the entry
          # in the dictionary if necessary
          groups.append(group)
          user_groups[user] = group

    return(user_groups)

print(groups_per_user({"local": ["admin", "userA"],
        "public":  ["admin", "userB"],
        "administrator": ["admin"] }))

如何遍历抛出列表,同时尽可能高效地将用户添加到组名中?

请原谅我的语法,这是我的第一个问题。谢谢

标签: pythonalgorithm

解决方案


您的代码的问题是只有一个groups列表,而您真正想要的是每个用户的组列表。试试这个

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] = []
            user_groups[user].append(group)
    return user_groups

setdefault或者,我们可以用调用替换这三行:

def groups_per_user(group_dictionary):
    user_groups = {}
    for group, users in group_dictionary.items():
        for user in users:
            user_groups.setdefault(user, []).append(group)
    return user_groups

第三种选择是使用默认字典:

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

推荐阅读