Подтвердить что ты не робот

Лучший способ определить многомерные словари в python?

В настоящее время я использую метод ниже, чтобы определить многомерный словарь в python. Мой вопрос: является ли это предпочтительным способом определения многомерных dicts?

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)

чтобы получить следующую структуру:

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

Я также использую это, чтобы увеличивать счетчики "на лету" для пользователя без необходимости проверять, существует ли ключ или уже установлен на 0. Например:.

userdict['site1']['board1']['username']['pageviews'] += 1
4b9b3361

Ответ 1

Кортежи хешируются. Наверное, мне не хватает смысла, но почему бы вам не использовать стандартный словарь с соглашением о том, что ключи будут тройками? Например:

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

Ответ 2

Вы можете создать многомерный словарь любого типа, например:

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()

Ответ 3

Это очень субъективный вопрос с моей точки зрения. Для меня реальный вопрос заключается в том, в какой момент вы продвигаете эту вложенную структуру данных на объекты с методами, чтобы изолировать вас от изменений. Тем не менее, я, как известно, создавал большие пространства имен прототипов со следующим:

from collections import defaultdict

def nesteddict(): 
  return defaultdict(nesteddict)

Ответ 4

Это очень субъективно, но если ваш dict будет больше глубины в 2 н., я вернусь к созданию класса и определению методов/свойств, чтобы делать то, что вы хотите.

Я думаю, что вашей конечной целью было бы создать структуру данных с несколькими столбцами, чтобы вы могли хранить любое количество атрибутов для определенного объекта (в данном случае сайта). Создание класса сайта выполнило бы это, а затем вы можете вставлять экземпляры, где бы вы ни были другие объекты (переменные), - с некоторыми отмеченными исключениями.