web-dev-qa-db-fra.com

La meilleure façon de définir des dictionnaires multidimensionnels en python?

J'utilise actuellement la méthode ci-dessous pour définir un dictionnaire multidimensionnel en python. Ma question est la suivante: est-ce la façon privilégiée de définir les dits multidimensionnels?

from collections import defaultdict

def site_struct(): 
    return defaultdict(board_struct)

def board_struct(): 
    return defaultdict(user_struct)

def user_struct(): 
    return dict(pageviews=0,username='',comments=0)

userdict = defaultdict(site_struct)

pour obtenir la structure suivante:

userdict['site1']['board1']['username'] = 'tommy'

J'utilise également cela pour incrémenter les compteurs à la volée pour un utilisateur sans avoir à vérifier si une clé existe ou est déjà définie sur 0. Par exemple.:

userdict['site1']['board1']['username']['pageviews'] += 1
29
James

Les tuples sont lavables. Je manque probablement le point, mais pourquoi n'utilisez-vous pas un dictionnaire standard avec la convention que les clés seront des triplets? Par exemple:

userdict = {}
userdict[('site1', 'board1', 'username')] = 'tommy'
45

Vous pouvez créer un dictionnaire multidimensionnel de tout type comme celui-ci:

from collections import defaultdict
from collections import Counter

def multi_dimensions(n, type):
  """ Creates an n-dimension dictionary where the n-th dimension is of type 'type'
  """  
  if n<=1:
    return type()
  return defaultdict(lambda:multi_dimensions(n-1, type))

>>> m = multi_dimensions(5, Counter)
>>> m['d1']['d2']['d3']['d4']
Counter()
16
andersonvom

C'est une question assez subjective de mon point de vue. Pour moi, la vraie question serait de savoir à quel moment promouvez-vous cette structure de données imbriquée en objets avec des méthodes pour vous protéger des changements. Cependant, je suis connu pour créer de grands espaces de noms de prototypage avec les éléments suivants:

from collections import defaultdict

def nesteddict(): 
  return defaultdict(nesteddict)
1
Shane Holloway

C'est très subjectif - mais si votre dict devient de plus de 2 n de profondeur, je reviens à la création d'une classe et à la définition de méthodes/propriétés pour faire ce que vous voulez.

Je pense que votre objectif final serait de créer une structure de données "multi-colonnes" afin que vous puissiez stocker un nombre quelconque d'attributs pour un objet particulier (dans ce cas, un site). La création d'une classe de site accomplirait cela et alors vous pouvez coller des instances où vous le feriez avec n'importe quel autre objet (variable) - avec quelques exceptions notées.

1
Burhan Khalid