2017-12-10 8 views
-2

私は、さまざまな辞書を区別するために変数に辞書名を入れようとしています。辞書名にどのように変数を入れるのですか?

私はこれ試してみた:

str(y) + dictionary['z'] = Z 

を私は「にSyntaxError:オペレータに割り当てることはできません」を取得

+1

これは何をすると思われますか? – Sebastian

+4

すべての辞書を辞書に入れて、文字列を使って検索することができます。 – ekhumoro

+0

正確には、エコモロ。 Bob、このような変数を動的に作成しないでください。これがデータ構造の目的です。 –

答えて

0

一つの解決策は、空のクラスまたは類似しているが、もう少し洗練されたを使用することですtypesモジュールのSimpleNamespace

from types import SimpleNamespace 

bag = SimpleNamespace() 
bag.dict1 = {'somekey': 'somevalue'} 
bag.dict2 = {'otherkey': 'othervalue'} 

これは、機能的にほぼ同等であるが、もう少し可読bagために辞書を使用するよりなる傾向にある:比較bag.dict1['somekey']

bag['dict1']['somekey']の別の利点は、autocompletersは、典型的にサポートすることです文字列ではありません。あなたは自動補完 とシェルやエディタにあるのであれば、あなたは bag.dを入力して bag.dictを取得するために tabを打つが、これはリテラル文字列と文字列変数の両方によるアクセスが必要な場合は、ほとんど空のクラスがある bag['d

では動作しないことができますより柔軟:

class name_space: 
    def __checkkey__(self, key): 
     # better safe than sorry 
     if key.startswith('_') or key.endswith('_') or not key.isidentifier(): 
      raise ValueError(f"Unsupported key: {key}") 
    def __getitem__(self, key): 
     self.__checkkey__(key) 
     return self.__dict__.__getitem__(key) 
    def __setitem__(self, key, value): 
     self.__checkkey__(key) 
     return self.__dict__.__setitem__(key, value) 
    def __delitem__(self, key): 
     self.__checkkey__(key) 
     return self.__dict__.__delitem__(key) 

今、あなたが行うことができます:

bag = name_space() 
key = 'dict1' 
bag[key] = {} 
bag.dict1['somekey'] = 'somevalue' 

など

関連する問題