1
votes

Comment inverser l'attribution de valeurs aux clés d'un dictionnaire? résoudre l'algorithme

La fonction groups_per_user reçoit un dictionnaire, qui contient les noms de groupe avec la liste des utilisateurs. Comme les groupes dans le système Linux. Les utilisateurs peuvent appartenir à plusieurs groupes. Remplissez les espaces vides pour renvoyer un dictionnaire avec les utilisateurs comme clés et une liste de leurs groupes comme valeurs.

En gros, j'essaye d'inverser l'attribution des groupes aux utilisateurs au lieu des utilisateurs aux groupes

C'est ce que j'ai essayé jusqu'à présent:

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"] }))

Comment puis-je parcourir jeter la liste et en même temps ajouter l'utilisateur au nom du groupe aussi efficacement que possible? P >

Veuillez excuser mes grammaires, c'est ma première question ici. Merci


3 commentaires

Cette stackoverflow.com/a/485368/2947378 ?


Que voulez-vous dire par "Remplissez les blancs"? Quels blancs?


1. Vous n'avez probablement pas du tout besoin de la liste des groupes . 2. Les valeurs de votre dict user_groups n'ont pas de sens - vous le définissez sur un seul groupe, alors que ce que vous voulez probablement vraiment est une liste (ou mieux encore, un ensemble) des groupes de cet utilisateur est dans. 3. La logique peut être encore simplifiée en utilisant un defaultdict dont la valeur par défaut est un set () .


3 Réponses :


1
votes

Quelque chose comme ça?

from collections import defaultdict

def groups_per_user(group_dictionary):
    user_groups = defaultdict(set)
    for group, users in group_dictionary.items():
        for user in users:
            user_groups[user].add(group)
    return user_groups


0 commentaires

3
votes

Le problème avec votre code est qu'il n'y a qu'une seule liste de groupes , alors que vous voulez réellement une liste de groupes pour chaque utilisateur. Essayez ceci

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

Sinon, nous pourrions remplacer ces trois lignes par un appel 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

Un troisième l'option est d'utiliser un defaultdict:

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


1 commentaires

Cela fonctionne aussi. Merci



2
votes

Peu importe les gars, je viens de le résoudre. tout ce dont j'avais besoin est d'obtenir le groupe par utilisateur et de le concaténer en une liste vide:

le nouveau code est

def groups_per_user(group_dictionary):
    user_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 the list of
          # groups for this user, creating the entry
          # in the dictionary if necessary
          user_groups[user] = user_groups.get(user,[]) + [group]

    return(user_groups)

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


0 commentaires