Ответ 1
Кортежи хешируются. Наверное, мне не хватает смысла, но почему бы вам не использовать стандартный словарь с соглашением о том, что ключи будут тройками? Например:
userdict = {}
userdict[('site1', 'board1', 'username')] = 'tommy'
В настоящее время я использую метод ниже, чтобы определить многомерный словарь в 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
Кортежи хешируются. Наверное, мне не хватает смысла, но почему бы вам не использовать стандартный словарь с соглашением о том, что ключи будут тройками? Например:
userdict = {}
userdict[('site1', 'board1', 'username')] = 'tommy'
Вы можете создать многомерный словарь любого типа, например:
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()
Это очень субъективный вопрос с моей точки зрения. Для меня реальный вопрос заключается в том, в какой момент вы продвигаете эту вложенную структуру данных на объекты с методами, чтобы изолировать вас от изменений. Тем не менее, я, как известно, создавал большие пространства имен прототипов со следующим:
from collections import defaultdict
def nesteddict():
return defaultdict(nesteddict)
Это очень субъективно, но если ваш dict будет больше глубины в 2 н., я вернусь к созданию класса и определению методов/свойств, чтобы делать то, что вы хотите.
Я думаю, что вашей конечной целью было бы создать структуру данных с несколькими столбцами, чтобы вы могли хранить любое количество атрибутов для определенного объекта (в данном случае сайта). Создание класса сайта выполнило бы это, а затем вы можете вставлять экземпляры, где бы вы ни были другие объекты (переменные), - с некоторыми отмеченными исключениями.