new - python dictionary append




Existe-t-il une implémentation "multimap" en Python? (5)

Il n'y a pas de multi-cartes dans les bibliothèques standard Python actuellement.

WebOb a une classe MultiDict utilisée pour représenter les valeurs de formulaire HTML, et elle est utilisée par quelques frameworks Python Web, donc l'implémentation est testée en combat.

Werkzeug a aussi une classe MultiDict , et pour la même raison.

Je suis nouveau à Python, et je suis familier avec les implémentations de Multimaps dans d' other languages . Python a-t-il une telle structure de données intégrée ou est-elle disponible dans une bibliothèque couramment utilisée?

Pour illustrer ce que je veux dire par "multimap":

a = multidict()
a[1] = 'a'
a[1] = 'b'
a[2] = 'c'

print(a[1])  # prints: ['a', 'b']
print(a[2])  # prints: ['c']

Je ne comprends pas clairement la sémantique de votre exemple

a[1] = 'a'
a[1] = 'b' #??

Est la deuxième ligne a[1] = 'b' censé remplacer l'élément à [1]. Si oui, alors vous devez utiliser un dictionnaire. Sinon - vous devez utiliser le dictionnaire des listes (comme déjà suggéré)


La façon standard d'écrire ceci en Python est avec une dict dont les éléments sont chacun une list ou un set . Comme le dit stephan202 , vous pouvez l'automatiser avec un defaultdict, mais vous n'êtes pas obligé de le faire.

En d'autres termes, je traduirais votre code à

a = dict()
a[1] = ['a', 'b']
a[2] = ['c']

print(a[1])  # prints: ['a', 'b']
print(a[2])  # prints: ['c']

Ou sous-classe dict :

class Multimap(dict):
    def __setitem__(self, key, value):
        if key not in self:
            dict.__setitem__(self, key, [value])  # call super method to avoid recursion
        else
            self[key].append(value)

Une telle chose n'est pas présente dans la bibliothèque standard. Vous pouvez utiliser un defaultdict si:

>>> from collections import defaultdict
>>> md = defaultdict(list)
>>> md[1].append('a')
>>> md[1].append('b')
>>> md[2].append('c')
>>> md[1]
['a', 'b']
>>> md[2]
['c']

(Au lieu de list vous pouvez utiliser set , auquel cas vous appellerez .add au lieu de .append .)

En aparté : regardez ces deux lignes que vous avez écrites:

a[1] = 'a'
a[1] = 'b'

Cela semble indiquer que vous voulez que l'expression a[1] soit égale à deux valeurs distinctes. Cela n'est pas possible avec les dictionnaires car leurs clés sont uniques et chacune d'elles est associée à une seule valeur. Ce que vous pouvez faire, cependant, est d'extraire toutes les valeurs dans la liste associée à une clé donnée, une par une. Vous pouvez utiliser iter suivi d'appels successifs à next pour cela. Ou vous pouvez simplement utiliser deux boucles:

>>> for k, v in md.items():
...     for w in v:
...         print("md[%d] = '%s'" % (k, w))
... 
md[1] = 'a'
md[1] = 'b'
md[2] = 'c'




dictionary