2009-05-03 13 views

答えて

8

内蔵型を簡単に拡張できます。これは、あなたが辞書でそれを行うだろうかです:

>>> class MyClass(dict): 
...  def __init__(self, *args, **kwargs): 
...    self['mykey'] = 'myvalue' 
...    self['mykey2'] = 'myvalue2' 
... 
>>> x = MyClass() 
>>> x['mykey'] 
'myvalue' 
>>> x 
{'mykey2': 'myvalue2', 'mykey': 'myvalue'} 

私はこれについて語っPythonドキュメントを見つけることができませんでしたが、(無料のオンラインで利用可能)に非常に人気のある本Dive Into Pythonhas a few examplesこれを行うには。

+0

私の好奇心を飽和させていただきありがとうございます。 –

+2

私はdict .__ init__への呼び出しを からhttp://stackoverflow.com/questions/817884/creating-dictionaries-with-pre-defined-keys/818019#818019(またはさらに優れた、ユーザーの方が良い)から追加するべきだと思います。 –

+0

これは元々(履歴をチェックして)それを持っていた方法ですが、いくつかの調査の後では、この場合は明らかに必要ありません。上記のDive Into Pythonのリンクによれば、 "dictはこのようには動作せず、ラッパーでもなく、明示的な初期化も必要ありません。" - そこにスーパーコールを持っていたのは私の最初の本能だったので、それについてもう少し詳しく知りたいです。 –

0

dictのサブクラスを作成し、メソッドでキーを追加するだけです。

 
class MyClass(dict) 

def __init__(self): 
    """Creates a new dict with default values"""" 

    self['key1'] = 'value1' 

あなたはそれがサブクラスであることについてあまり心配する必要はありませんので、あなたの代わりに辞書を実装することができ、「辞書のような行為は」通常、1つのように扱われていることというのpythonで任意のクラス、しかし覚えておいてくださいメソッドがありますが、上記のアプローチはおそらくあなたにとってもっと役に立ちます:)。

3

あなたがそれをサブクラス化することができますので、はい、Pythonのdictで、クラスである:ここで

class SubDict(dict): 
     def __init__(self): 
      dict.__init__(self) 
      self.update({ 
       'foo': 'bar', 
       'baz': 'spam',}) 

あなたは辞書の__init__()メソッド(クラスのインスタンスが作成されたときに呼び出されるメソッド)をオーバーライドします。 __init__の中で最初にsupercalssの__init__()メソッドを呼び出します。これは、基本クラスの機能を拡張するのが一般的です。その後、新しいインスタンスSubDictionaryを初期データで更新します。

subDict = SubDict() 
    print subDict # prints {'foo': 'bar', 'baz': 'spam'} 
8

あなたはまた、__setitem__()

>>> class LimitedDict(dict): 
    _keys = "a b c".split() 
    def __init__(self, valtype=int): 
     for key in LimitedDict._keys: 
      self[key] = valtype() 
    def __setitem__(self, key, val): 
     if key not in LimitedDict._keys: 
      raise KeyError 
     dict.__setitem__(self, key, val) 


>>> limited = LimitedDict() 
>>> limited['a'] 
0 
>>> limited['a'] = 3 
>>> limited['a'] 
3 
>>> limited['z'] = 0 

Traceback (most recent call last): 
    File "<pyshell#61>", line 1, in <module> 
    limited['z'] = 0 
    File "<pyshell#56>", line 8, in __setitem__ 
    raise KeyError 
KeyError 
>>> len(limited) 
3 
+0

+1の追加情報 –

+0

これは私にとって完璧な解決策です、ありがとう!しかし、最初にアンカー文字で '_keys'プロパティを宣言する理由を説明できますか? –

+0

応答が遅くなりますが、先頭のアンダースコアはメンバーがローカル(「保護」)であることを示す非公式の表記です。 –

1

をオーバーライドすることで、私は、これはあなたが探しているものであるわからないんだけど、私が読んだときに、dictのサブクラスは、事前に定義されたリストに鍵を制限することができますあなたの記事私は即座に、演習をカウントするためのキーを動的に生成することを検討していると思っていました。デフォルトでは、あなたのためにこれを行いますperlのとは異なり


grep{$_{$_}++} qw/ a a b c c c /; 
print map{$_."\t".$_{$_}."\n"} sort {$_{$b}$_{$a}} keys %_; 

c 3 
a 2 
b 1 

Pythonは自由のためのあなたにこれを与えることはありません。


l = ["a","a","b","c","c","c"] 
d = {} 
for item in l: 
    d[item] += 1 

Traceback (most recent call last): 
    File "./y.py", line 6, in 
    d[item] += 1 
KeyError: 'a' 

しかし、defaultdictはあなたのためにこれを行います、


from collections import defaultdict 
from operator import itemgetter 

l = ["a","a","b","c","c","c"] 
d = defaultdict(int) 
for item in l: 
    d[item] += 1 

dl = sorted(d.items(),key=itemgetter(1), reverse=True) 
for item in dl: 
    print item 

('c', 3) 
('a', 2) 
('b', 1) 
+0

私は欲しいものではありませんでしたが、試していただきありがとうございます。 –

関連する問題