web-dev-qa-db-ja.com

Pythonで多次元辞書を定義する最良の方法?

私は現在、Pythonで多次元辞書を定義するために以下の方法を使用しています。私の質問は次のとおりです。これは、多次元辞書を定義するための好ましい方法ですか?

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
29
James

タプルはハッシュ可能です。おそらく私は要点を逃していますが、キーがトリプルになるという規則を持つ標準の辞書を使用してみませんか?例えば:

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

次のようなタイプの多次元辞書を作成できます。

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

これは私の観点からはかなり主観的な質問です。私にとって本当の問題は、このネストされたデータ構造を、変更からユーザーを隔離するメソッドを持つオブジェクトに昇格するのはどの時点かです。ただし、次のようにして大きなプロトタイピング名前空間を作成することで知られています。

from collections import defaultdict

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

これは非常に主観的ですが、あなたの口述が2 nを超える深さになった場合、私はクラスを作成し、メソッド/プロパティを定義して必要なことを行うことに戻ります。

私の最終的な目標は、「複数列」のデータ構造を作成して、特定のオブジェクト(この場合はsite)の属性をいくつでも格納できるようにすることだと思います。サイトクラスを作成するとそれが実現し、他のオブジェクト(変数)と同じ場所にインスタンスを固定できます-いくつかの例外があります。

1
Burhan Khalid