2017-11-14 13 views
0

を「+ = 1」増分を取るためにPythonのautovivを調整する:私のことができるようにしてみたい私はいくつかの共通のpython autovivificationコードのビルド辞書を使用しています

class autoviv(dict): 
    """Implementation of perl's autovivification feature.""" 

    def __getitem__(self, item): 
     try: 
      return dict.__getitem__(self, item) 
     except KeyError:  
      value = self[item] = type(self)() 
      return value 

ことの一つは、場合に値をインクリメントすることです

TypeError: unsupported operand type(s) for +=: 'autoviv' and 'int' 
:エラーが返され

d['a']+=1 

そう:NOキーが現在そう等+ =表記を使用して、指定された辞書ネスティング・レベルに存在しません

これを回避するには、キーをインクリメントする前にキーが存在するかどうかを確認するステップを作成しましたが、できればそのステップをやめてしまいます。

この強化機能を利用するには、上記のautoviv()コードをどのように変更する必要がありますか?私はグーグルで試してみたが、数時間かけてさまざまなアプローチを試みたが、喜びはなかった。

アドバイスありがとうございます!

+0

'd [" a "]は何を返しますか? – Sraw

+0

申し訳ありません。上記のautovivの働きは、最小入力は「d ['a'] = X(例えば1)」となります。 "d ['a']"がまだ存在しない場合は、そのキーを辞書に作成し、その値= {a:1}のように指定する番号を設定します。キーが既に存在する場合のみ、 "d ['a'] + = 1"を使用できます。今のところ、キーが存在せず+ = 1を使用すると、エラーが発生します。存在しないキーの場合、 "d ['a'] + = 1"を使用し、k:vペアをエラーをスローせずに自動作成するようにしたいと考えています。応答していただきありがとうございます! – ouonomos

答えて

0

AutovivicationはすでにPythonで、collectionsの内部にあります。defaultdictです。

from collections import defaultdict 


#Let's say we want to count every character 
# that occurs 
text = "Let's implement autovivication!" 
di = defaultdict(int) 
for char in text: 
    di[char] += 1 
print(di) 

#Another way of doing this is using a defualt string 
# (or default int, or whatever you want) 
currentDict = {'bob':'password','mike':'12345'} 
di = defaultdict(lambda:'unknown user', currentDict) 
print(di['bob']) 
print(di['sheryl']) 

ただし、自分で実装しようとしている場合。あなたはあなたのアイテムを割り当てて、そのアイテムへの参照を取得する必要があります。

def __getitem__(self, item): 
    try: 
     return dict.__getitem__(self, item) 
    except KeyError: 
     value = self[item] = type(self)()   
     return dict.__getitem__(self, item) 
+0

ありがとう!しかし、 ''コレクションからimport defaultdict d = defaultdict(int) ['a'] ['v'] + = 1'は私に "TypeError: 'int'オブジェクトに属性 '__getitem__'"がありません " – ouonomos

関連する問題