11 votes

Convertir la clé de 2-tuple en dictionnaire et l'ajouter à un nouveau dictionnaire en tant que valeur de dictionnaire.

J'ai donc les valeurs :

values = {(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0}

et je veux convertir le dictionnaire ci-dessus pour être :

values = {0: {0: 0, 1: 1}, 1: {0: 1, 1: 0}}

ma fonction :

def convert(values : {(int,int): int}) -> {int: {int: int}}:
    dictionary = {}
    l = []

    for k in d.keys():
        l.append(k)

    for k,v in d.items():
        for i in l:
            if i == k:
                dictionary[v] = dict(l)

    return dictionary

mais j'obtiens ceci comme résultat à la place :

values = {0: {0: 1, 1: 1}, 1: {0: 1, 1: 1}}

11voto

Stephen Rauch Points 29619

Une boucle et dict.setdefault() peut faire ça comme :

Code :

values = {(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0}

result = {}
for k, v in values.items():
    result.setdefault(k[0], {})[k[1]] = v

print(result)

Résultats :

{0: {0: 0, 1: 1}, 1: {0: 1, 1: 0}}

10voto

juanpa.arrivillaga Points 35811

Vous voulez juste regrouper les choses. La méthode idiomatique consiste à utiliser un defaultdict :

>>> from collections import defaultdict
>>> values = {(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0}
>>> new_values = defaultdict(dict)
>>> for (x,y), v in values.items():
...     new_values[x][y] = v
...
>>> new_values
defaultdict(<class 'dict'>, {0: {0: 0, 1: 1}, 1: {0: 1, 1: 0}})
>>>

2voto

wim Points 35274

Je vous propose une approche plus générale :

from collections import defaultdict

def tree():
    def the_tree():
        return defaultdict(the_tree)
    return the_tree()

t = tree()
for (x, y), z in values.items():
    t[x][y] = z

Pour "fermer" un nœud de l'arbre à d'autres ajouts, il suffit de définir sa fabrique par défaut sur None . Par exemple, pour le sceller au niveau du tronc :

>>> t.default_factory = None
>>> t[2]
# KeyError

1voto

CommuSoft Points 6439

Une solution pour une profondeur arbitraire :

def convert_tupledict(d):
    result = {}
    for ks, v in d.items():
        subresult = result
        *kis, ks = ks
        for ki in kis:
            if ki in subresult:
                subresult = subresult[ki]
            else:
                subresult[ki] = subresult = {}
        subresult[ks] = v
    return result

Nous pouvons alors l'appeler avec :

convert_tupledict({(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0})

Pour les 2-tuples, la sulution suivante devrait être suffisante :

def convert_2tupledict(d):
    result = {}
    for (k1, k2), v in d.items():
        result.setdefault(k1, {})[k2] = v
    return result

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X