2017-03-27 25 views
-1

ネストされた値とそれらのリトリーブを簡単に挿入できるデータ構造が必要です。私が想像することのように構成されているクラスである:私は機能をリストの下Pythonはリストからネストされたdictキーを設定します

class Settings: 
    def __init__(self): 
    self._dict = {} 

    def setItem(self, key, value): 
    #this function i need 

    def getItem(self, key): 
    #and that 

は、属性を呼び出し、_dict変換に必要な:

setItem('simple', 'simple-value') 
# _dict : { 'simple': 'simple-value' } 

setItem('user.name', 'alice') 
# _dict : { 'simple': 'simple-value, 'user': { 'name': 'alice' } } 

setItem('user.sub.hash': 152) 
# _dict : { 'simple': 'simple-value, 'user': { 'name': 'alice', 'sub: { 'hash': 152 } } } 

getItem('user.name') 
#returns 'alice' 

getItem('user.notavailable') 
#KeyError 

を誰もがそれに役立つことはできますか?再帰が必要ですか?アドバイスを歓迎します。

+3

あなたのためにコードを記述していただきたいようです。多くのユーザーは、苦労しているコーダーのコードを作成したいと考えていますが、通常、ポスターが既に問題を解決しようとしているときにのみ役立ちます。この作業を実証するには、これまでに書いたコード([mcve]の作成)、サンプル入力(あれば)、期待される出力、実際に出力するもの(出力、トレースバック、等。)。あなたが提供する詳細があれば、受け取る可能性のある回答が増えます。 [ツアー]と[質問]を確認します。 – TigerhawkT3

+0

ええ、私はもちろん、私は別のものを試しましたが、私が望むように何も働かなかったと考えます。私はしばしば、他の人が同様の問題を抱えているかどうかを尋ねます。私は、他の人が知っているユースケースかもしれないので、私の質問は広すぎるとは思わない。他の人が同様の問題をどのように解決したかについても嬉しく思います。 – niklas

+0

そのような議論は、フォーラムにもっと適しています。 SOは特定の質問に焦点を当てており、空のメソッドスタブの束はそのようなものではありません。 – TigerhawkT3

答えて

0

構文に柔軟性がある場合は、this questionへの回答は、ほぼ達成します。 collections.defaultdictを使用して(とthis answer次)例えば

from collections import defaultdict 

def nested_default(): 
    return defaultdict(nested_default) 

a = nested_default() 
a['simple'] = 'simple-value' 
a['user']['name'] = 'alice' 
a['user']['sub']['hash'] = 152 

a['user']['notavailable']ではなく、キーのエラーよりも空defaultdictを返しますが、あなたはそれを回避できる可能性があります。

+0

他の回答をコピー・ペーストしないでください。重複していると思われる場合は、それに投票してください。 – TigerhawkT3

+0

@Tigerhawk私は別の質問に対する答えがこのユーザーが望んでいるものをどのように達成できるかを示しています。ここで2つの関連するコード行を書くことは、元の質問にリンクするだけでなく、はるかに明確になります。 – Stuart

+1

異なる質問に対する答えがユーザーの望むものをどのように達成するかを示すために、それを複製として閉じます。彼らは、重複したリンクをクリックして、関連するコード行、さらに潜在的に多くの有用なデータを見ることができます。これは、複製システムの複製ポイント全体です。 – TigerhawkT3

1

以下のコードを確認してください。それは提供されたテストケースを通過しました。

class Dict: 
    def __init__(self): 
     self._dict = {} 

    def setItem(self, key, value): 
     if '.' not in key: 
      self._dict[key] = value 
      return self._dict 

     if self._dict.has_key(key.split('.')[0]): 
      self._dict[key.split('.')[0]].update(Dict().setItem(key.partition('.')[2], value)) 
     else: 
      self._dict[key.split('.')[0]] = Dict().setItem(key.partition('.')[2], value) 
     return self._dict 

    def getItem(self, key): 
     value = self._dict 
     for k in key.split('.'): 
      value = value[k] 

     return value 

    def __str__(self): 
     return str(self._dict) 
関連する問題